2011-07-26 44 views
9

我正在寻找一种计划任务,在任务启动后,几个先前的任务已完成。具有复杂依赖关系的任务调度

我有几百个“收集器”进程从各种来源收集数据并将其转储到数据库。一旦完成收集(从1秒到几分钟),我想立即启动一大堆“数据处理”过程来分析和理解数据库中的数据。当所有这些都完成后,我想要开始一项最终任务,并向我发送摘要数据的电子邮件。

我目前正在使用Gearman队列,并在定时器启动数据处理任务,一旦我预计“收集器”进程已完成,但这意味着处理步骤在10分钟后开始,即使收集器进程3(或更糟,尚未完成)完成。

理想情况下,我可以指定特定的规则,例如“当进程A和(B或C)完成时启动进程X”,或者“当指定进程的95%完成或10分钟已经过去时启动进程Y ”。

进程和依赖关系需要自动创建,因为每次都会使用不同的参数运行进程和依赖项(即,我没有每次执行相同的计算)。

我可以使用队列和监视器自己编写某种图形依赖框架,但它似乎是必须已经解决的事情,我正在寻找使用类似我所描述的东西的人。

+0

不太可能在PHP中完成。 – andho

回答

7

“启动过程X过程时,A和(B或C)完成”

为什么不让作业者X启动子Worker A,B和C,等待他们继续之前完成?您可以同时拥有一个既是Gearman工人又是客户的流程X.

+0

+1,没有理由不能连锁排练员队列。因此,客户端Alpha将工作发送给Gearman队列1,这项工作将发送给Gearman Worker 1A。部分工作使得Gearman工作人员1A充当了一个Gearman客户端,它将一个子工作发送给Gearman Queue 2,后者又将工作分派给另一名工人(例如2A或1B) –

0

你有一些非常特殊的条件:

  • B或C
  • 全部的95%或10分钟的经过

起初我还以为你的进程是简单异步的。在这种情况下,您可以使用称为延迟和承诺的东西。在处理Ajax调用数据时,我在JavaScript中使用了很多。有了这个,你基本上配置了一个依赖关系图。

但是你的情况更加复杂。显然你需要一个'或',进度监控和定时器。

这是非常像un-PHP的东西。 PHP的cron作业支持非常差,不支持异步任务,也没有定时器。你为什么在PHP中这样做?

+0

由于历史原因,这些任务本身在PHP中 - 它们最初是作为在线进程完成的,而不是使用队列在后台完成的。从本质上讲,它们是作为命令行中的unix脚本运行的,所以如果有其他语言/框架更好地支持这些复杂的依赖关系,我可以更改它们吗? – Crashthatch