django/celery - 芹菜状态:错误:在时间限制内没有节点回复

Posted

技术标签:

【中文标题】django/celery - 芹菜状态:错误:在时间限制内没有节点回复【英文标题】:django/celery - celery status: Error: No nodes replied within time constraint 【发布时间】:2012-11-14 13:42:14 【问题描述】:

我正在尝试在我的生产服务器中部署一个简单的 celery 示例,我已经按照 celery 网站中关于将 celery 作为守护进程运行http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing 的教程进行操作,并且我在 /etc 中获得了配置文件/default/celeryd

1 # 要启动的节点名称 2 # 这里我们只有一个节点 3 CELERYD_NODES="w1" 4 # 或者我们可以有三个节点: 5 #CELERYD_NODES="w1 w2 w3" 6 7 # 开始时 chdir 的位置。 8 CELERYD_CHDIR="/home/audiwime/cidec_sw" 9 10 # 来自环境的 Python 解释器。 11 ENV_PYTHON="/usr/bin/python26" 12 13 # 如何调用“manage.py celeryd_multi” 14 CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi" 15 16 ##如何调用“manage.py celeryctl” 17 CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl" 18 19 # celeryd 的额外参数 20 CELERYD_OPTS="--time-limit=300 --concurrency=8" 21 22 # celery 配置模块的名称。 23 CELERY_CONFIG_MODULE="celeryconfig" 24 25 # %n 将替换为节点名。 26 CELERYD_LOG_FILE="/var/log/celery/%n.log" 27 CELERYD_PID_FILE="/var/run/celery/%n.pid" 28 29 # 工人应该以非特权用户身份运行。 30 CELERYD_USER="audiwime" 31 CELERYD_GROUP="audiwime" 32 33 导出 DJANGO_SETTINGS_MODULE="cidec_sw.settings"

但是如果我跑了

芹菜状态

在终端,我得到了这样的回应:

错误:在时间限制内没有节点回复

我可以通过https://github.com/celery/celery/tree/3.0/extra/generic-init.d/中提供的celeryd脚本重启celery

/etc/init.d/celeryd 重启 celeryd-multi v3.0.12 (Chiastic Slide) > w1.one.cloudwime.com: DOWN > 重启节点 w1.one.cloudwime.com:OK

我可以运行python26 manage.py celeryd -l info 并且我在 django 中的任务运行良好,但是如果我让守护进程完成它的工作,我不会得到任何结果,甚至不会出现 /var/log/celery/ 中的错误w1.log

我知道我的任务已被注册,因为我这样做了

from celery import current_app
def call_celery_delay(request):
    print current_app.tasks
    run.delay(request.GET['age'])
    return HttpResponse(content="celery task set",content_type="text/html")

我得到一本字典,其中出现了我的任务

'celery.chain': <@task: celery.chain>, 'celery.chunks': <@task: celery.chunks>, 'celery.chord': <@task: celery.chord>, 'tasks.add2': <@task: tasks.add2>, 'celery.chord_unlock': <@task: celery.chord_unlock>, **'tareas.tasks.run': <@task: tareas.tasks.run>**, 'tareas.tasks.add': <@task: tareas.tasks.add>, 'tareas.tasks.test_two_minute': <@task: tareas.tasks.test_two_minute>, 'celery.backend_cleanup': <@task: celery.backend_cleanup>, 'celery.map': <@task: celery.map>, 'celery.group': <@task: celery.group>, 'tareas.tasks.test_one_minute': <@task: tareas.tasks.test_one_minute>, 'celery.starmap': <@task: celery.starmap>

但除此之外,我什么也没得到,我的任务没有任何结果,日志中没有错误,什么也没有。 有什么问题?

【问题讨论】:

【参考方案1】:

使用以下命令查找问题:

C_FAKEFORK=1 sh -x /etc/init.d/celeryd start

这通常是因为您的源项目中存在问题(权限问题、语法错误等)

如 celery 文档中所述:-

如果工作人员以“OK”开始但之后几乎立即退出 并且日志文件中没有任何内容,那么可能有错误 但由于守护进程的标准输出已经关闭,你不会 能够在任何地方看到它们。对于这种情况,您可以使用 C_FAKEFORK 环境变量跳过守护进程

祝你好运

来源:Celery Docs

【讨论】:

【参考方案2】:

因为 celery 守护进程可能没有启动。这是原因之一。所以请使用 python manage.py celeryd --loglevel=INFO

重新启动它

【讨论】:

【参考方案3】:

我解决了我的问题,这是一个非常简单的解决方案,但也是一个奇怪的解决方案: 我所做的是:

$ /etc/init.d/celerybeat restart
$ /etc/init.d/celeryd restart
$ service celeryd restart

我必须按此顺序执行此操作,否则我会得到一个丑陋的错误:没有节点在时间限制内回复。

【讨论】:

我认为您不需要celerybeatceleryd。你可以运行celeryd -B,也是一样的。我还是很好奇你是怎么得到service celeryd :) (附注:我还是得到这个错误) @kave 此错误主要出现在所有文件权限不正确时 @AkashDeshpande 感谢您的回复。拜托你好心看看这个贴:pastebin.com/e3GK4eax这是我设置权限的方式,你看到什么明显的不正常了吗? @Kave chmod 770 命令将 0 权限授予访问计算机的其他用户。即您的用户 celery 无权访问这些文件。我认为你应该尝试使用 chmod 777。我知道这可能是一个安全漏洞,但这很可能是你的问题。遇到问题后,您可以更改权限。 @AkashDeshpande 我现在在两个目录上都尝试了chmod -R 777,没有任何区别。无论如何,我认为这不是问题chmod 770 提供对用户和组的完全访问权限,在这种情况下是 celery 和 celerygroup,两者都在 celery 配置中定义。因此 celery 守护进程应该使用该组中的该用户并访问该目录而不会遇到任何问题。很奇怪……

以上是关于django/celery - 芹菜状态:错误:在时间限制内没有节点回复的主要内容,如果未能解决你的问题,请参考以下文章

Django Celery delay() 总是推送到默认的“芹菜”队列

Django celery beat 在 Elastic Beanstalk 上看不到周期性任务

让 django celery worker 在 elastic-beanstalk 上启动的问题

InterfaceError:连接已关闭(使用 django + celery + Scrapy)

Django celery 任务:新创建的模型 DoesNotExist

本地主机上的 Django/Celery 多个队列 - 路由不起作用