gpt4 book ai didi

python - 为什么 Celery 在 Python shell 中工作,但在我的 Django View 中却不工作? (导入问题)

转载 作者:太空狗 更新时间:2023-10-29 17:13:51 24 4
gpt4 key购买 nike

我安装了 Celery(最新稳定版)。我有一个名为 /home/myuser/fable/jobs 的目录。在此目录中,我有一个名为 tasks.py 的文件:

from celery.decorators import task
from celery.task import Task

class Submitter(Task):
def run(self, post, **kwargs):
return "Yes, it works!!!!!!"

在此目录中,我还有一个名为 celeryconfig.py 的文件:

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "abc"
BROKER_PASSWORD = "xyz"
BROKER_VHOST = "fablemq"

CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )

在我的 /etc/profile 中,我将这些设置为我的 PYTHONPATH:

  • PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs

因此,我使用控制台 ($ celeryd --loglevel=INFO) 运行我的 Celery worker,然后尝试一下。我打开 Python 控制台并导入任务。然后,我运行提交程序。

>>> import fable.jobs.tasks as tasks
>>> s = tasks.Submitter()
>>> s.delay("abc")
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987>

一切正常,正如您在我的控制台中看到的那样

[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s:

但是当我进入我的 Django 的 views.py 并运行上面的 3 行代码时,我得到了这个:

[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'}
Traceback (most recent call last):
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message
eventer=self.event_dispatcher)
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message
eta=eta, expires=expires)
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__
self.task = tasks[self.task_name]
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__
raise self.NotRegistered(str(exc))
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported."

这很奇怪,因为当我启动 celeryd 客户端时,它确实显示它已注册。

[2011-01-09 17:38:27,446: WARNING/MainProcess]  
Configuration ->
. broker -> amqp://GOGOme@localhost:5672/fablemq
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 1
. loader -> celery.loaders.default.Loader
. logfile -> [stderr]@INFO
. events -> OFF
. beat -> OFF
. tasks ->
. tasks.Decayer
. tasks.Submitter

有人可以帮忙吗?

最佳答案

这就是我所做的,终于奏效了

我在 Settings.py 中添加了

CELERY_IMPORTS = ("myapp.jobs", )

我在 myapp 文件夹下创建了一个名为 jobs.py 的文件

from celery.decorators import task

@task(name="jobs.add")
def add(x, y):
return x * y

然后从命令行运行:python manage.py celeryd -l info

在另一个 shell 中我运行了 python manage.py shell,然后

>>> from myapp.jobs import add
>>> result = add.delay(4, 4)
>>> result.result

然后我得到:

16

重要的一点是,当您添加一个新函数时,您必须重新运行两个命令 shell。您必须在客户端和服务器上都注册该名称。

:-)

关于python - 为什么 Celery 在 Python shell 中工作,但在我的 Django View 中却不工作? (导入问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com