Tengo alrededor de 50 carpetas de datos para procesar, y tengo un script ruby que procesa los archivos de una carpeta (la carpeta que procesa se basa en un archivo de configuración .yml). Y una computadora con cuatro CPU.
Me gustaría poder iniciar los 50 procesos, pero solo tengo 4 de ellos ejecutándose activamente en cualquier momento, y tener los otros 46 pausados. Una vez que uno de los procesos finaliza, me gustaría que uno de los procesos pausados no se pause, hasta que se completen los 50. De esa manera, puedo hacer
./super_script.rb > folder_1_log.txt
*edit config.yml*
./super_script.rb > folder_2_log.txt
*edit config.yml*
...
Y concéntrate en otra cosa hasta que el procesamiento haya terminado.
¿Es posible hacer esto? ¿Hay algunos términos para lo que quiero que pueda googlear?
(Otra alternativa sería hacer que super_script sea capaz de multiprocesamiento, tal vez soy un gato asustado por no tomar ese enfoque)
(El sistema operativo es Ubuntu Linux, y la mayor parte del tiempo de la CPU no es ocupado por super_script.rb, sino por otros programas ruby que llama a través del sistema ())
fuente
Respuestas:
Aquí hay un script bash que parece que hace algo parecido a lo que desea hacer: inicia una serie de procesos en paralelo, pero se asegura de que no se ejecuten más de n al mismo tiempo.
Por otro lado, si lo que está haciendo está vinculado al disco, en lugar de estar vinculado a la CPU (le pregunto porque dice que tiene "50 carpetas de datos para procesar"), entonces es posible que esté mejor ejecutando todos sus procesos en serie para evitar la contención del disco entre los procesos.
fuente