Considérez le scénario suivant. J'ai deux programmes A et B. Le programme A sort sur des lignes de chaînes stdout tandis que le programme B traite les lignes de stdin. La façon d'utiliser ces deux programmes est bien sûr :
[protégé par e-mail] :~$ A | B
Maintenant, j'ai remarqué que cela ne consomme qu'un seul noyau; donc je me demande :
Les programmes A et B partagent-ils les mêmes ressources de calcul ? Si oui, existe-t-il un moyen d'exécuter A et B simultanément ?
Une autre chose que j'ai remarquée est que A s'exécute beaucoup plus rapidement que B, donc je me demande s'il pourrait en quelque sorte exécuter plus de programmes B et les laisser traiter les lignes que A sort en parallèle.
Autrement dit, A sortirait ses lignes, et il y aurait N instances de programmes B qui liraient ces lignes (celui qui les lit en premier), les traiterait et les sortirait sur stdout.
Donc ma dernière question est :
Existe-t-il un moyen de diriger la sortie vers A parmi plusieurs processus B sans avoir à s'occuper des conditions de concurrence et autres incohérences qui pourraient éventuellement survenir ?
Réponse acceptée :
Un problème avec split --filter
est que la sortie peut être mélangée, vous obtenez donc une demi-ligne du processus 1 suivie d'une demi-ligne du processus 2.
GNU Parallel garantit qu'il n'y aura pas de confusion.
Supposons donc que vous vouliez faire :
A | B | C
Mais ce B est terriblement lent, et donc vous voulez le paralléliser. Ensuite, vous pouvez faire :
A | parallel --pipe B | C
GNU Parallel se divise par défaut sur \n et une taille de bloc de 1 Mo. Cela peut être ajusté avec –recend et –block.
Vous pouvez en savoir plus sur GNU Parallel à :http://www.gnu.org/s/parallel/
Vous pouvez installer GNU Parallel en seulement 10 secondes avec :
$ (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
Regardez la vidéo d'introduction sur http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1