组的链永远挂在芹菜

时间:2018-11-27 20:32:43

标签: python django asynchronous celery django-celery

我正在尝试在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)()

但是它当然在本地运行,这不是我想要的。

1 个答案:

答案 0 :(得分:0)

创建链后,请确保在使用组时正在使用不可变或可变的签名。例如:

res = group(job_chain.si(), job_chain.si())()