2011-07-26 16 views
9

Estoy buscando una forma de programar tareas donde una tarea comienza una vez que se han completado varias tareas anteriores.Programación de tareas con dependencias complejas

Tengo varios cientos de procesos de "recopilación" que recopilan datos de una variedad de fuentes y las vuelcan a una base de datos. Una vez que estos hayan terminado de recopilarse (entre 1 segundo y unos minutos), quiero iniciar inmediatamente un grupo de procesos de "procesamiento de datos" para analizar y dar sentido a los datos en la base de datos. Cuando todos estos hayan finalizado, quiero iniciar una tarea final y enviarme un correo electrónico con los datos de resumen.

Actualmente estoy usando una cola de Gearman y comenzando las tareas de procesamiento de datos en temporizadores una vez que espero que los procesos de "colector" se hayan completado, pero esto significa que el proceso comienza después de 10 minutos, incluso si el colector procesa terminado después de 3 (o peor, aún no ha terminado).

Idealmente, podría especificar reglas específicas como "iniciar el proceso X cuando se completan el proceso A y (B o C)" o "iniciar el proceso Y cuando se ha completado el 95% de los procesos especificados o han transcurrido 10 minutos ".

Los procesos y las dependencias deben crearse automáticamente ya que se ejecutarán con diferentes parámetros cada vez (es decir, no estoy haciendo un cálculo idéntico cada vez).

Podría escribir algún tipo de marco de dependencia de gráficos utilizando colas y monitores, pero parece que el tipo de cosas ya deben haber sido resueltas y estoy buscando a alguien que haya usado algo como lo describo.

+0

Es poco probable que se haya hecho en PHP. – andho

Respuesta

7

"iniciar el proceso de X cuando el proceso A y (B o C) completa"

Por qué no dejar subworkers trabajador X de lanzamiento A, B y C y esperar a que se complete antes de proceder? Puede tener un proceso X que sea tanto un trabajador de Gearman como un cliente al mismo tiempo.

+0

+1, no hay ninguna razón por la que no pueda encadenar las colas de engranaje. Para que el cliente Alpha envíe trabajo a Gearman Queue 1, este trabajo se envía a Gearman Worker 1A.Parte del trabajo hace que Gearman Worker 1A actúe como un cliente de engranaje que envía un trabajo secundario a Gearman Queue 2, que a su vez envía el trabajo a otro trabajador (2A o 1B, por ejemplo) –

0

usted tiene algunas condiciones muy peculiares:

  • B o C
  • 95% completas o 10 minutos transcurrieron

Al principio pensé que sus procesos eran simplemente asíncrona. En ese caso, podría usar algo llamado diferido y promesas. Estoy usando esto mucho en JavaScript cuando trato con ajax llamadas de datos. Con esto, básicamente estás configurando un gráfico de dependencia.

Pero su caso es aún más complejo. Aparentemente necesitas un 'o', monitoreo de progreso y temporizadores.

Esto es todo algo que no es PHP. PHP tiene soporte de trabajo cron muy pobre, sin soporte para tareas asincrónicas y sin temporizadores. ¿Por qué estás haciendo esto en PHP?

+0

Las tareas en sí mismas están en PHP por razones históricas: inicialmente se realizaron como procesos en línea en lugar de en segundo plano utilizando una cola. Esencialmente, se ejecutan como scripts de Unix desde la línea de comandos, por lo que puedo cambiarlos si hay algún otro lenguaje/marco que soporte mejor estas complejas dependencias. – Crashthatch

Cuestiones relacionadas