我正在尝试在celery中构建以下工作流程:
(chainA)
task1 -- task2 -- task3--|
|
(chainB) | (group)
task1 -- task2 -- task3--|-------------
|
(chainC) |
task1 -- task2 -- task3--|
.
.
.
我最终得到以下代码:
list_chains = build_s_chains()
group(*list_chains)()
执行行组(* list_chains)()的那一刻,一切都停止了, 停止。似乎是一个死锁,没有引发错误。
如果我尝试在for循环中执行链,那么一切都很好,但是如果我在for循环中执行它们,我将无法在for循环的末尾连接另一个任务。我知道那是和弦的定义,我也尝试过和弦,但它仍然阻塞。
检查了我的Rabbitmq和后端结果,一切似乎都很好,因为我可以手动运行链。在我看来,这应该很简单,但是我看不到它不起作用的原因。 感谢您的帮助
例如,chainA看起来像这样:
job_chain = (
process_task.s(chip_measurement_object.raw_result_ref,
process_args,
process_args['file_path'],
process_args['meas_data'],
process_args['marker_data'],
process_args['session']
) |
update_marker_data.s() |
plot_task.s(chip_measurement_object.id) |
grade_task.s(chip_measurement_object.id) |
postgres_async_res_update.s(chip_measurement_object.id, self.input_args)
)
正如我提到的,job_chain.apply_async()可以很好地执行,但是当组中有多个链时,它会挂起或阻塞。 我看过其他答案和文档,根据他们的说法,这应该可以工作。
这是我的芹菜设置:
# Sensible settings for celery
CELERY_ALWAYS_EAGER = False
CELERY_ACKS_LATE = True
CELERY_TASK_PUBLISH_RETRY = True
CELERY_DISABLE_RATE_LIMITS = False
# By default we will not ignore result
# If you want to see results and try out tasks_old interactively, change it to False
# Or change this setting on tasks_old level
CELERY_IGNORE_RESULT = False
CELERY_SEND_TASK_ERROR_EMAILS = False
CELERY_TASK_RESULT_EXPIRES = 600
更新: 当我设置CELERY_ALWAYS_EAGER = True时,该组使用命令
运行正常group(*chain_list)()
但是它当然在本地运行,这不是我想要的。
答案 0 :(得分:0)
创建链后,请确保在使用组时正在使用不可变或可变的签名。例如:
res = group(job_chain.si(), job_chain.si())()