Celery:如果父任务超时,则不执行子任务组

时间:2018-09-22 09:39:48

标签: python django celery django-celery

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

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

子任务具有专用的队列和与父任务分离的工作者。另外,子任务队列的工作程序位于执行父任务的服务器的远程服务器上。

有时,在启动子任务组的过程中,此父任务失败或超时。在那之后,子任务队列的(远程)工作程序变成了麻烦。它会在网上/离线中波动,最终停止执行任务。它们已收到,但从未被远程工作者启动。

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

1 个答案:

答案 0 :(得分:0)

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

一旦我们从subtask.s(foo, bar, baz)更改为subtask.s(foo.id, bar.id, baz.id)

,事情变得非常顺利