Considere el siguiente escenario. Tengo dos programas A y B. El programa A da salida a líneas estándar de cadenas mientras que el programa B procesa líneas desde la entrada estándar. La forma de utilizar estos dos programas es, por supuesto:
[correo electrónico protegido]:~$ A | B
Ahora me he dado cuenta de que esto consume solo un núcleo; por eso me pregunto:
¿Los programas A y B comparten los mismos recursos computacionales? Si es así, ¿hay alguna forma de ejecutar A y B al mismo tiempo?
Otra cosa que he notado es que A se ejecuta mucho más rápido que B, por lo tanto, me pregunto si de alguna manera podría ejecutar más programas B y dejar que procesen las líneas que genera A en paralelo.
Es decir, A generaría sus líneas y habría N instancias de programas B que leerían estas líneas (quien las lea primero), las procesaría y las generaría en la salida estándar.
Así que mi pregunta final es:
¿Hay alguna forma de canalizar la salida a A entre varios procesos B sin tener que ocuparse de las condiciones de carrera y otras incoherencias que podrían surgir?
Respuesta aceptada:
Un problema con split --filter
es que la salida se puede mezclar, por lo que obtiene media línea del proceso 1 seguida de media línea del proceso 2.
GNU Parallel garantiza que no habrá confusión.
Así que asume que quieres hacer:
A | B | C
Pero ese B es terriblemente lento y, por lo tanto, desea paralelizarlo. Entonces puedes hacer:
A | parallel --pipe B | C
GNU Parallel por defecto se divide en \n y un tamaño de bloque de 1 MB. Esto se puede ajustar con –recend y –block.
Puede encontrar más información sobre GNU Parallel en:http://www.gnu.org/s/parallel/
Puede instalar GNU Parallel en solo 10 segundos 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
Mira el video de introducción en http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1