使用Celery

时间:2015-09-24 02:13:42

标签: python rabbitmq celery

我正在为我的任务排队工作流程评估芹菜。我的要求略显独特。系统具有项目概念,每个项目都有(可能很大)与之相关的任务。我希望排队系统以公平的方式分配这些任务,因为一个项目中有很多要处理的任务不会使其他项目挨饿。

例如,假设ProjectA有100个与之关联的任务,并且所有这些任务都是同时提交的。前5个任务被撤下并提交给5名工人。虽然前5个任务正在处理,但ProjectB提交了另外100个任务。 ProjectB不必等待ProjectA完成其所有100个任务以获得一些处理时间。相反,一旦工人变得自由,它应该处理ProjectB任务。然后,下一个变为自由的工作者应该以循环方式处理ProjectA任务,等等。

我的想法是,我可以为每个项目动态创建新队列,并让所有工作人员从所有队列中拉出,如this SO post中所述。但是,根据this answer,芹菜工人实际上会按照提交的顺序处理任务,无论他们在哪个队列(这看起来有点奇怪)。这对我不起作用,因为它会导致在当前处理之后提交的项目的饥饿。

芹菜可以用来实现我的要求吗?如果没有,是否有建议的最佳实践来实现我的要求?

1 个答案:

答案 0 :(得分:3)

从我的测试中,芹菜可用于实现您的要求,因为队列是循环式处理的。请参阅other SO post you referenced中的答案。

根据您需要对ProjectB任务的响应速度,您可能需要调整PREFETCH_MULTIPLIER的值。我认为默认值为4,根据我的理解,这意味着您的芹菜工人将4个批次中的物品从队列中取出(有关详细信息,请参阅this SO post)。所以,如果你有很多工人,ProjectA队列中的很多项目可能已经被保留了#34;即使它们还没有被处理,你的ProjectB内容也会排成一行所有这些保留的项目背后。