python - Celery:如果父任务超时,则不执行子任务组
问题描述
我有一个父任务,我正在通过组执行子任务:
@task()
def parent():
...
for x in big_long_loop:
subtasks = []
...
subtasks.append(subtask.s(foo, bar, baz))
...
g = group(*subtasks)
g.delay()
子任务有一个与父任务分开的专用队列和工作人员。此外,子任务队列的工作人员位于执行父任务的服务器的远程服务器上。
有时,在启动子任务组的过程中,此父任务会失败或超时。在那之后,子任务队列的(远程)工作人员变得混乱。它在花中在线/离线波动,最终只是停止执行任务。它们被接收但从未被远程工作者启动。
这是预期的行为吗?如果父级最终没有成功,它将如何影响在该任务期间或将来再次执行该任务时创建的任何子任务?这与在远程服务器上的 haywire 工作人员有什么关系吗?请注意,此服务器具有其他队列的其他工作人员,并且它们不会闪烁脱机。
解决方案
经过一番痛苦,我们在这里发现了问题:我们正在将 django 模型对象传递给子任务。这造成了某种减速,因为我猜测来自父计算机的 db 连接被保留并传递到远程机器,导致 DB 和 rabbitmq 减速,因为对象通过“通过父计算机”db 连接访问数据库。
一旦我们subtask.s(foo, bar, baz)
从subtask.s(foo.id, bar.id, baz.id)
推荐阅读
- excel - 这个 $ExternalData_1 在 Excel PowerPivot 和 PowerQuery 中应该是什么意思?
- swift - Firestore 批处理集仅插入最后一项
- ios - Swift 如何根据单击的工具栏按钮将用户引导到不同的视图控制器
- mysql - 以写列的顺序排序
- opendj - 无法将属性添加到 OpenDJ LDAP 中的条目
- itext - PDFA 文档缺少注释和标记
- amazon-web-services - 如何限制用户使用 IAM 从亚马逊 S3 下载数据?
- sql - 需要 sql 查询来匹配三个值
- javascript - Photoshop 脚本数组到 json
- angular - Angular中伊斯坦布尔覆盖报告中的标记异常