Considera il seguente scenario. Ho due programmi A e B. Il programma A emette le righe di stringhe stdout mentre il programma B elabora le righe da stdin. Il modo per utilizzare questi due programmi è ovviamente:
[email protetta]:~$ A | B
Ora ho notato che questo mangia solo un nucleo; quindi mi chiedo:
I programmi A e B condividono le stesse risorse di calcolo? In tal caso, c'è un modo per eseguire A e B contemporaneamente?
Un'altra cosa che ho notato è che A funziona molto più velocemente di B, quindi mi chiedo se in qualche modo è possibile eseguire più programmi B e lasciarli elaborare le righe che A emette in parallelo.
Cioè, A emetterebbe le sue righe e ci sarebbero N istanze di programmi B che leggerebbero queste righe (chiunque le legga per primo), le elaborano e le emettono su stdout.
Quindi la mia ultima domanda è:
C'è un modo per reindirizzare l'output ad A tra diversi processi B senza doversi occupare delle condizioni di gara e di altre incoerenze che potrebbero potenzialmente sorgere?
Risposta accettata:
Un problema con split --filter
è che l'output può essere confuso, quindi ottieni mezza riga dal processo 1 seguita da mezza riga dal processo 2.
GNU Parallel garantisce che non ci saranno scambi.
Quindi supponi di voler fare:
A | B | C
Ma quel B è terribilmente lento, e quindi vuoi metterlo in parallelo. Allora puoi fare:
A | parallel --pipe B | C
GNU Parallel per impostazione predefinita si divide su \n e una dimensione del blocco di 1 MB. Questo può essere regolato con –recend e –block.
Puoi trovare maggiori informazioni su GNU Parallel su:http://www.gnu.org/s/parallel/
Puoi installare GNU Parallel in soli 10 secondi con:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh
Guarda il video introduttivo su http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1