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)
后,事情变得非常顺利
我有一个父任务,我正在通过组执行子任务:
@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)