为什么 Celery 守护进程看不到任务?

2024-02-12

我有一个在 Debian 7.8 上运行的 Django 1.62 应用程序,其中 Nginx 1.2.1 作为我的代理服务器,Gunicorn 19.1.1 作为我的应用程序服务器。我安装了 Celery 3.1.7 和 RabbitMQ 2.8.4 来处理异步任务。我可以将 Celery Worker 作为守护进程启动,但每当我尝试运行测试“添加”任务(如 Celery 文档中所示)时,都会收到以下错误:

Received unregistred task of type u'apps.photos.tasks.add'.
The message has been ignored and discarded.

Traceback (most recent call last):
File "/home/swing/venv/swing/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 455, in on_task_received
strategies[name](message, body,
KeyError: u'apps.photos.tasks.add'

我的所有配置文件都保存在“conf”目录中,该目录位于“myproj”项目目录下方。 “添加”任务位于 apps/photos/tasks.py 中。

myproj
│
├── apps
    ├── photos
    │   ├── __init__.py
    │   ├── tasks.py
    conf
    ├── celeryconfig.py
    ├── celeryconfig.pyc
    ├── celery.py
    ├── __init__.py
    ├── middleware.py
    ├── settings
    │   ├── base.py
    │   ├── dev.py
    │   ├── __init__.py
    │   ├── prod.py
    ├── urls.py
    ├── wsgi.py

这是任务文件:

# apps/photos/tasks.py
from __future__ import absolute_import
from conf.celery import app

@app.task
def add(x, y):
    return x + y

这是我的 Celery 应用程序和配置文件:

# conf/celery.py
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
from conf import celeryconfig

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conf.settings')
app = Celery('conf')
app.config_from_object(celeryconfig)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

# conf/celeryconfig.py
BROKER_URL = 'amqp://guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'amqp'
CELERY_ACCEPT_CONTENT = ['json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

这是我的 Celery 守护进程配置文件。我注释掉了 CELERY_APP,因为我发现如果取消注释,Celery 守护进程甚至不会启动。我还发现我需要将“--config”参数添加到 CELERYD_OPTS 才能启动守护进程。我创建了一个非特权的“celery”用户,可以写入日志和 pid 文件。

# /etc/default/celeryd
CELERYD_NODES="worker1"
CELERYD_LOG_LEVEL="DEBUG"
CELERY_BIN="/home/myproj/venv/myproj/bin/celery"
#CELERY_APP="conf"
CELERYD_CHDIR="/www/myproj/"
CELERYD_OPTS="--time-limit=300 --concurrency=8 --config=celeryconfig"
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"
CELERYD_USER="celery"
CELERYD_GROUP="celery"
CELERY_CREATE_DIRS=1

我可以从日志文件中看到,当我运行命令“sudo service celeryd start”时,Celery 启动时没有任何错误。但是,如果我打开 Python shell 并运行以下命令,我将看到我在开头描述的错误。

$ python shell
In [] from apps.photos.tasks import add
In [] result = add.delay(2, 2)

有趣的是,如果我检查 Celery 的注册任务对象,则会列出该任务:

In [] import celery
In [] celery.registry.tasks

Out [] {'celery.chain': ..., 'apps.photos.tasks.add': <@task: apps.photos.tasks.add of conf:0x16454d0> ...}

这里的其他类似问题已经讨论了 PYTHONPATH 环境变量,但我没有这样的变量。我从来不明白如何设置 PYTHONPATH,并且这个项目在没有它的情况下已经运行良好一年多了。

我还应该补充一点,我的生产设置文件是conf/settings/prod.py。它从 base.py 导入我的所有基础(与层无关)设置,并添加一些额外的与生产相关的设置。

谁能告诉我我做错了什么?我已经为这个问题苦苦挣扎了三天了。

Thanks!


看起来这是由于相对导入错误而发生的。

>>> from project.myapp.tasks import mytask
>>> mytask.name
'project.myapp.tasks.mytask'

>>> from myapp.tasks import mytask
>>> mytask.name
'myapp.tasks.mytask'

如果您使用相对导入,则应该明确设置名称。

@task(name='proj.tasks.add')
def add(x, y):
   return x + y

查看:http://celery.readthedocs.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports http://celery.readthedocs.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Celery 守护进程看不到任务? 的相关文章

随机推荐

  • PHP 中未终止的实体引用

    这是我的代码
  • 什么是名称查找机制?

    我想知道C 名称查找机制是什么 名称查找是识别名称含义的过程 名称查找有两个目的 消除代码解析的歧义 确定代码的确切含 义 例如 如果你有这个代码 T a 这取决于是否T是否是一个类型 如果是一个类型 它将是一个声明a 如果它不是类型 则将
  • 我必须在 Next.js 项目中使用express吗?

    我正在制作一个网站Next js Next js提供SSR and dynamic routing 我必须使用express 如果是这样 为什么我必须使用它 具有什么样的特点express有用但未提供的Next js I think nex
  • 提供满足esm、commonjs和bundlers的模块、主要和浏览器字段

    我有许多已发布的 npm 包 我已将它们升级为提供 commonjs 和 esm 构建 有些包可能同时适用于节点和浏览器 所有使用 webpack 或 rollup 编译的包 所有内容都用打字稿编写并转换为dist目录 我创建了一个comm
  • iOS 上的 html5 录音

    我正在尝试访问 iOS 上的麦克风以捕获用户输入
  • Azure SQL 中所有用户的列表

    如何列出可以连接到我的 sql server 数据库的所有用户 现在可以找到任何 sql 命令 我尝试了互联网上的一些链接 但没有一个有效 我尝试过的一些命令 SELECT FROM sys sql logins SELECT FROM s
  • 我应该如何配置 grunt-usemin 来使用相对路径

    我有一个由 yeoman generator 支持的 grunt 项目 我是基于generator webapp https github com yeoman generator webapp 如果有帮助 您可以在GitHub https
  • MVVM 和 StructureMap 的使用

    我的 MVVM 应用程序中有大量父级详细信息 ViewModel 像这样的事情 SchoolsViewModel SchoolViewModel LessonViewModel PupilsViewModel PupilViewModel
  • Bitset 作为函数的返回值

    我想要一个接口 其函数返回一个位集 class IMyInterface public virtual std bitset lt 100 gt GetBits 0 问题是我不想强制大小bitset 所以我想我必须使用boost dynam
  • Ruby 2.0 字节码导出/导入

    我一直在读关于红宝石 2 0 新功能 http www rubyinside com ruby 2 0 implementation work begins what is ruby 2 0 and whats new 5515 html
  • 使用 JavaScript 创建 Base64 编码图像

    由于图像是数据 我们可以将代码编写为 img src alt Red dot 现在我的观点是 我们可以使用 javascript 创建 base64 数据吗 有什么框架吗 我的实际要求是我有一个像 Cow 这样的字符串 我希望它作为图像 注
  • Java 最终抽象类

    我有一个非常简单的问题 我想要一个 Java 类 它提供一个公共静态方法 该方法可以执行某些操作 这只是为了封装目的 将所有重要的内容都放在一个单独的类中 这个类既不应该被实例化 也不应该被扩展 这让我写道 final abstract c
  • 打开软键盘时,DialogFragment 始终会调整大小

    我在全屏显示的自定义 DialogFragment 方面遇到一些问题 该对话框包含可滚动的内容并具有自动完成文本视图 最初 对话框在顶部显示有边距 以编程方式设置为布局内容顶部的透明视图 一旦 autocompletetextview 获得
  • Android-如何区分 Galaxy S-3 和 Galaxy S-4 布局?

    我在区分三星 Galaxy s4 和三星 Galaxy s3 的布局文件夹时遇到问题 我尝试过layout sw360dp layout sw360dp xxhdpi layout sw360dp xhdpi等 一直以来 galaxy s4
  • 是否可以在 iCal.net 上使用 UTC 偏移量代替时区名称?

    我的应用程序将 UTC 偏移量存储在用户配置文件上 例如 03 00 并且正如 iCal net Wiki 中的此页面提到的那样 我似乎只能使用时区来分配给事件 https github com rianjs ical net wiki W
  • 在 Chrome 中单击并拖动光标

    我正在开发一个网络应用程序 我需要覆盖一些默认光标 在 Chrome 中 当我单击然后拖动它时 它总是将光标更改为文本选择 我似乎找不到任何方法来覆盖它 我正在使用jquery 通常的 document css cursor default
  • fifo - 循环读取

    我想用os mkfifo http docs python org 2 library os html os mkfifo用于程序之间的简单通信 我在循环读取 fifo 时遇到问题 考虑这个玩具示例 其中我有一个读取器和一个写入器使用 fi
  • 获取中间层(Functional API)的输出并在SubClassed API中使用

    In the 喀拉斯文档 https keras io getting started faq 它说如果我们想选择中间层模型的输出 顺序和功能 我们需要做的如下 model create the original model layer n
  • 如何“git pull”同时忽略本地更改?

    有没有办法做一个git pull忽略任何本地文件更改 而无需清除目录并执行git clone 如果您的意思是希望拉动覆盖本地更改 就像工作树是干净的一样进行合并 那么 清理工作树 git reset hard git pull 如果有未跟踪
  • 为什么 Celery 守护进程看不到任务?

    我有一个在 Debian 7 8 上运行的 Django 1 62 应用程序 其中 Nginx 1 2 1 作为我的代理服务器 Gunicorn 19 1 1 作为我的应用程序服务器 我安装了 Celery 3 1 7 和 RabbitMQ