在芹菜中打破无限循环

时间:2013-03-22 13:27:51

标签: celery

我使用celery.chord(...)来创建一组任务和一个在组中的所有任务完成后调用的方法。

我使用amqp结果后端(但我想切换到memcached)。

我的工作人员每秒都会反复打印这条线。我不知道如何打破这种无限循环。我可以访问rabbitMQ web界面,但我找不到ID为“32ba5fe4 -...”的内容。

[2013-03-22 14:18:26,896: INFO/MainProcess] Task celery.chord_unlock[32ba5fe4-918c-480f-8a78-a310c11d0c3a] retry: Retry in 1s
[2013-03-22 14:18:26,897: INFO/MainProcess] Got task from broker: celery.chord_unlock[32ba5fe4-918c-480f-8a78-a310c11d0c3a] eta:[2013-03-22 13:18:27.895123+00:00]

这是一个测试环境。没有数据可以丢失。

我使用Celery 3.0.16

3 个答案:

答案 0 :(得分:4)

它不应该是一个无限循环。

celery.chord_unlock任务检查和弦子任务是否已完成以调用合并回调任务。如果没有,它会安排自己再次检查。您的和弦任务完成后,您将不再在日志中看到这些消息。

已编辑:您可以撤销chord_unlock任务以停止循环

celery.control.revoke('32ba5fe4-918c-480f-8a78-a310c11d0c3a')

答案 1 :(得分:1)

我有同样的问题。为了停止循环,我安装了flower,然后从Web界面的任务菜单中撤消了该任务。 撤消按钮位于单击任务的UUID后显示的任务详细信息页面中。

答案 2 :(得分:1)

为了进行健全性检查,我通过工人启动时的信号设置max_retries

from celery.signals import worker_init
@worker_init.connect
def limit_chord_unlock_tasks(worker, **kwargs):
    """
    Set max_retries for chord.unlock tasks to avoid infinitely looping
    tasks. (see celery/celery#1700 or celery/celery#2725)
    """
    task = worker.app.tasks['celery.chord_unlock']
    if task.max_retries is None:
        retries = getattr(worker.app.conf, 'CHORD_UNLOCK_MAX_RETRIES', None)
        task.max_retries = retries

然后在我的Celery配置中添加CHORD_UNLOCK_MAX_RETRIES变量。