首页 > 解决方案 > Celery:如果父任务超时,则不执行子任务组

问题描述

我有一个父任务,我正在通过组执行子任务:

@task()
def parent():    
  ...
  for x in big_long_loop:
    subtasks = []
    ...
    subtasks.append(subtask.s(foo, bar, baz))
    ...
    g = group(*subtasks)
    g.delay()

子任务有一个与父任务分开的专用队列和工作人员。此外,子任务队列的工作人员位于执行父任务的服务器的远程服务器上。

有时,在启动子任务组的过程中,此父任务会失败或超时。在那之后,子任务队列的(远程)工作人员变得混乱。它在花中在线/离线波动,最终只是停止执行任务。它们被接收但从未被远程工作者启动。

这是预期的行为吗?如果父级最终没有成功,它将如何影响在该任务期间或将来再次执行该任务时创建的任何子任务?这与在远程服务器上的 haywire 工作人员有什么关系吗?请注意,此服务器具有其他队列的其他工作人员,并且它们不会闪烁脱机。

标签: pythondjangocelerydjango-celery

解决方案


经过一番痛苦,我们在这里发现了问题:我们正在将 django 模型对象传递给子任务。这造成了某种减速,因为我猜测来自父计算机的 db 连接被保留并传递到远程机器,导致 DB 和 rabbitmq 减速,因为对象通过“通过父计算机”db 连接访问数据库。

一旦我们subtask.s(foo, bar, baz)subtask.s(foo.id, bar.id, baz.id)


推荐阅读