Tengo que correr un programa intensivo en CPU (hecho en C) multiples veces, cambiando el input cada vez. Por eso uso Python, para automatizar este proceso.
Ahora tengo andando el siguiente sistema:
En una VM con 72 cores, y tengo X cantidad de inputs. Entonces creo 72 directorios y a cada uno le asigno X/72 inputs. Luego corro via un script, 72 veces el programa, cada instancia del programa consume esos X/72 inputs que tiene asignado. Mi script toma cada output, le hace un tarball y lo sube a un bucket. Todo esto funciona bien, pero no es óptimo, porque si uno de los cores termina de procesar su pila, se queda idle, mientras que otros cores tienen aun trabajos en su pila.
Lo que quiero hacer es un sistema que no necesite dividir el total del trabajo en 72 y luego darle una pila a cada core, sino mas bien que vaya dando trabajos a todos los cores y cuando uno se desocupe, le de el siguiente trabajo en la cola.
Considerando que el programa principal no es hecho en Python, (en Python es solo la orquestación de los trabajo y el procesamiento downstream del resultado), que soluciones me recomiendan? Celery? Otra? Tambien si se puede escalar a varias VMs, mejor.
Podés usar airflow.
Bah, o simplemente 72 procesos simples que leen un queue y ejecutan trabajos (hacer “pull” en vez de “push”)
El queue podría ser simplemente una carpeta con cosas adentro de la cual los workers agarran el más viejo.
Muchas gracias. Me gusta mas este approach. Quizas un dir no sirva porque necesito que evitar que 2 procesos agarren el mismo, y tener la capacidad de retry por si un trabajo falla (cada tanto pasa) quizas mejor meta en el medio una DB para tener un status de cada unidad. O SQS.
Asi que voy a hacer eso cuando lo termine por pongo aca.
GNU parallel?
parallel --jobs 72 "comando {}" :::: archivo_con_lista_de_inputs
También soporta mandar a otro server con -S
y --retry-failed
.
Si la orquestación que necesitás no es tan compleja por ahí te sirve.
Seba, buenas y santas
tengo un caso similar pero con 10.000 directorios, lo mejor es usar una cola de mensajeria donde ingresas cada archivo/“cosa” a procesar con cada programa.
en nuestro caso tenemos un script en python que escanea a lo Vruto 10mil directorios e ingresa todo lo procesable a una cola de mensajeria. (en realidad a un SNS porque necesitamos que se enteren varios procesos de cada mensaje)
despues los “clientes” van tomando las notificaciones y las van procesando.
me parece que con un SQS tenes mas que suficiente
Gus
Gracias por la respuesta, pero eso no serviría en este caso ya que no me ayuda a poner nuevas máquinas ni tiene mecanismos para retry cuando hay una falla, la solución es una cola como dijeron otros.
Si, en base a la respuesta de RAlsina hice una cola SQS y ahora está funcionando muy bien, me da la libertad de poner mas máquinas sin preocuparme de asignarle tareas, cada proceso busca la suya en la cola.
Aca está el ejemplo de como manejo la cola, luego falta el proceso pero es algo especifico con mi trabajo que asi como está no es de ayuda a nadie, pero si esto de la cola se puede aplicar a muchas cosas asi que lo comparto: