GNU/Linux >> Linux Esercitazione >  >> Linux

Esecuzione di comandi pipe in parallelo?

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


Linux
  1. Cheat sheet dei comandi di IPtables

  2. In quale ordine vengono eseguiti i comandi convogliati?

  3. Le utilità Linux sono intelligenti quando si eseguono comandi convogliati?

  4. Quale Bash è in esecuzione?

  5. Comandi Linux dalla A alla Z

Comandi Nmap con esempi

5 Comandi per la risoluzione dei problemi di rete Linux

YUM comandi

Comando eco di Linux

Esecuzione di comandi di stampa CMake prima dell'esecuzione

Bash:eseguire comandi dall'interno di un chroot e cambiare utente