Tengo una tarea que procesa una lista de archivos en stdin. El tiempo de inicio del programa es considerable, y la cantidad de tiempo que toma cada archivo varía ampliamente. Quiero generar una cantidad sustancial de estos procesos, luego enviar el trabajo a los que no estén ocupados. Hay varias herramientas de línea de comandos diferentes que casi hacen lo que quiero, lo reduje a dos opciones casi funcionales:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
El problema es que split
hace un round robin puro, por lo que uno de los procesos se queda atrás y queda atrás, retrasando la finalización de toda la operación; mientras que parallel
desea generar un proceso por N líneas o bytes de entrada y termino gastando demasiado tiempo en la sobrecarga de inicio.
¿Hay algo como esto que reutilizará los procesos y las líneas de alimentación a los procesos que hayan desbloqueado stdins?
myjob
está lista para recibir más información. No hay forma de saber que un programa está listo para procesar más entradas, todo lo que puede saber es que algún búfer en algún lugar (un búfer de tubería, un búfer estándar) está listo para recibir más entrada. ¿Puede organizar que su programa envíe algún tipo de solicitud (por ejemplo, mostrar un mensaje) cuando esté listo?
read
llamadas funcionaría. Ese es un esfuerzo de programación bastante grande.
-l 1
en los parallel
argumentos? IIRC, que le dice a paralelo que procese una línea de entrada por trabajo (es decir, un nombre de archivo por bifurcación de myjob, por lo que hay mucha sobrecarga de inicio).
split
comando? El nombre entra en conflicto con la utilidad de procesamiento de texto estándar .