我尝试遵循芹菜教程。我正在使用芹菜版本 4.1.0
|-module
|-tasks
|-__init__.py
|-tasks.py
__init__.py
的内容为空。我在任务目录中创建了一个名为 tasks.py 的文件。
from celery import Celery
app = Celery("tasks", broker="redis://localhost:6379/0", backend="redis://localhost:6379/0")
@app.task
def add(x, y):
return x + y
我已经启动了 Redis 服务器,在另一个终端窗口中,我启动了芹菜工作服务器:
celery worker -A module.tasks.tasks -l info -P eventlet
要运行任务,请执行以下操作:
$ python
>>> from tasks import add
>>> add.delay(1, 1)
在服务器工作程序终端窗口中,我收到以下错误:
[2018-03-21 13:46:48,859: ERROR/MainProcess] Received unregistered task of type 'module.tasks.tasks.add'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you're using relative imports?
Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.
The full contents of the message body was:
b'[[1, 2], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (81b)
Traceback (most recent call last):
File "C:UsersCalluAnaconda3envsprojectlibsite-packagesceleryworkerconsumerconsumer.py", line 561, in on_task_received
strategy = strategies[type_]
KeyError: 'module.tasks.tasks.add'
更新:如果更改任务目录并尝试调用 add 函数,它将起作用。但是假设如果我尝试从另一个 python 文件调用 add 函数,它会输出与以前相同的错误消息。
要立即运行芹菜,请首先确保您位于目录中module/tasks/
然后通过以下方式运行芹菜:
celery worker -A tasks -l info -P eventlet
我像这样开始我的芹菜:
python -m celery -A yourpackage #add your specific options here
以上意味着在您的 venv 中必须安装一个名为 yourpackage 的软件包。如果您不熟悉打包代码,请谷歌搜索how to create setup.py
或类似的短语。准备好软件包后,您可以像这样安装它:
source /path/to/your/venv
cd /path/to/your/yourpackage
pip install -e .
在此阶段,芹菜希望您的设置文件位于celery.py
文件中。我的celery.py
如下所示:
from celery import Celery
app = Celery(
'yourpackagename',
include=[
'tasks.tasks.add',
]
)
app.config_from_object('yourpackagename.celeryconfig')
现在你需要创建你的celeryconfig.py
文件(它不必那样调用,事实上你可能甚至不必那样做(;我使用 rabbitmq,所以你的值看起来会有所不同
# Setup backend
BACKEND = 'amqp'
BROKER_URL = 'amqp://myuser:mypassword@localhost:5672/myvhost'
此时,您的文件夹结构如下所示:
|-yourpackagename
|-setup.py
|-yourpackagename
|-celery.py
|-celeryconfig.py
|-tasks
|-__init__.py
|-tasks.py