GNU paralelo: reenviar todos los stdin a todos los procesos


2

Estoy tratando de procesar la entrada de diferentes maneras en paralelo, escribiendo las líneas resultantes a medida que entran. Mi enfoque actual es este:

# process_parallel.sh
read input
parallel --colsep ' ' --linebuffer 'echo $input | {}' \
 ::: 'python process1.py' ./process2.sh ./process3

El contexto se reduce a algo como esto:

(sleep 1; echo "short input arriving late") | ./process_parallel.sh | ./collate_results.sh

Lo anterior funciona pero tiene un inconveniente importante: los procesos no se inician hasta que se haya leído la entrada. Quiero iniciarlos de inmediato, ya que eso puede llevar un tiempo, luego hacer que la tubería paralela sea completamente estándar para cada uno de ellos.

¿Cómo lo logro?

Respuestas:


1

Se ha puesto bastante trabajo en GNU Parallel para que no comience un nuevo trabajo a menos que haya datos para ejecutar. Esto se debe a que algunos programas fallan mucho si no reciben ninguna entrada. Entonces trabajará contra el diseño de GNU Parallel.

Para duplicar la entrada que puede usar teey procesar la sustitución:

cat namedpipe_or_file | tee >(process1) >(process2) >(process3) >/dev/null

Se iniciará process1, process2y process3de inmediato. Sin embargo, la salida se puede mezclar, por lo que si se debe usar la salida, debe redirigirla a diferentes archivos:

cat namedpipe_or_file | tee >(process1 > out1) >(process2 > out2) >(process3 > out3) >/dev/null

0

Tenga dos scripts de envoltura: primero, modifique process_parallel.sh para que cada uno de los procesos reciba instrucciones de leer su entrada, de tres archivos, digamos file1, file2, file3.

Ahora escriba un segundo script de contenedor que envíe en paralelo su entrada estándar a los tres archivos, algo así como:

  #!/bins/bash
  #parallelise input
  # let's call this file parallelise
  parallel -j 3 -- "echo $1 > file1" "echo $1 > file2" "echo $1 file3"

Ahora comienzas tus cosas con:

  ./process_parallel_sh; cat InputFile | parallelise; 

Eso es aceptable, aunque usaría canalizaciones con nombre en lugar de archivos reales. Pero esperaba una forma más simple ... supongo que el paralelo simplemente no hace lo que necesito.
Sr. Wonko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.