具有多个队列的Python分布式任务

时间:2018-05-11 16:22:50

标签: python django celery

因此,我正在开发的项目需要一个分布式任务系统来处理CPU密集型任务。这是相对直接的,旋转芹菜并将所有任务排在队列中并让芹菜完成其余的工作。

我遇到的问题是每个用户都需要自己的队列,并且必须同步处理每个用户队列中的项目。因此,在用户队列中已经有一个任务已经处理,等到它完成之后才允许工人拿起下一个。

我最接近这样的事情是拥有一组固定的队列,并将它们分配给用户。然后将芹菜工作者挑选出的用户任务固定到具有1的并发性的特定队列。

这个系统的问题在于我无法扩展我的工作人员以处理积压的用户任务。

有没有办法可以配置芹菜去做我想做的事情,或者是否有其他任务系统可以做我想做的事情?

修改

目前我使用以下命令在固定的队列集上产生一个并发为1的芹菜工作者

celery multi start 4 -A app.celery -Q:1 queue_1 -Q:2 queue_2 -Q:3 queue_3 -Q:4 queue_4 --logfile=celery.log --concurrency=1

然后我在用户对象上存储队列名称,当用户启动进程时,我将任务排队到存储在用户对象上的队列。这给了我同步任务。

缺点是我有多个用户共享队列导致任务建立并且永远不会被处理。

我想说5个工作人员和每个用户对象的队列。然后让工作人员跳过队列,但一次只能在一个队列中拥有超过1个工作人员。

1 个答案:

答案 0 :(得分:1)

我按照特定顺序使用chain doc here条件执行任务:

chain = task1_task.si(account_pk) | task2_task.si(account_pk) | task3_task.si(account_pk)
chain()

因此,当完成i执行task2并完成执行task3时,我执行特定用户task1。 它会在任何可用的工人中产生:)

中途阻止链条:

self.request.callbacks = None
return

别忘了绑定你的任务:

@app.task(bind=True)
def task2_task(self, account_pk):