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

Celery: subtask group not executed if parent task times out

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

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

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

有时,在启动子任务组的过程中,此父任务会失败或超时。在那之后,子任务队列的(远程)工作人员就会失控。它在 flower 中波动 online/offline,最终只是停止执行任务。它们已收到,但从未被远程工作人员启动。

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

经过一番努力,我们发现了这里的问题:我们正在将 Django 模型对象传递给子任务。这造成了某种减速,因为我猜测来自父机器的数据库连接被保留并传递给远程机器,导致数据库和 rabbitmq 减速,因为对象通过 "via parent machine" 数据库连接访问数据库。

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

后,事情变得非常顺利