TIM*_*MEX 14 python unix django import celery
我安装了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!!!!!!"
Run Code Online (Sandbox Code Playgroud)
在这个目录中,我还有一个名为celeryconfig.py的文件:
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "abc"
BROKER_PASSWORD = "xyz"
BROKER_VHOST = "fablemq"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
Run Code Online (Sandbox Code Playgroud)
在我/etc/profile,我把这些设置为我的PYTHONPATH:
PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs所以我使用console($ celeryd --loglevel=INFO)运行我的Celery工作器,然后尝试一下.我打开Python控制台并导入任务.然后,我运行提交者.
>>> import fable.jobs.tasks as tasks
>>> s = tasks.Submitter()
>>> s.delay("abc")
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987>
Run Code Online (Sandbox Code Playgroud)
一切正常,正如您在我的控制台中看到的那样
[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s:
Run Code Online (Sandbox Code Playgroud)
但是当我进入我的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."
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为当我启动它时,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
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
Dav*_*han 11
这就是我最终的工作
在Settings.py中我添加了
CELERY_IMPORTS = ("myapp.jobs", )
Run Code Online (Sandbox Code Playgroud)
在myapp文件夹下,我创建了一个名为jobs.py的文件
from celery.decorators import task
@task(name="jobs.add")
def add(x, y):
return x * y
Run Code Online (Sandbox Code Playgroud)
然后从命令行运行:python manage.py celeryd -l info
在另一个shell中我运行了python manage.py shell,然后
>>> from myapp.jobs import add
>>> result = add.delay(4, 4)
>>> result.result
Run Code Online (Sandbox Code Playgroud)
而我得到:
16
重要的是,在添加新函数时必须重新运行两个命令shell.您必须在客户端和服务器上注册该名称.
:-)
Set*_*eth 10
我相信你的tasks.py文件需要在django应用程序(在settings.py中注册)才能导入.或者,您可以尝试从__init__.py主项目或其中一个应用程序中的文件导入任务.
还可以尝试从manage.py启动celeryd:
$ python manage.py celeryd -E -B -lDEBUG
Run Code Online (Sandbox Code Playgroud)
(-E和-B可能是也可能不是必要的,但是这是我使用的).
请参阅文档中的自动命名和相对导入:
http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports
任务名称是"tasks.Submitter"(如celeryd输出中所列),但您将任务导入为"fable.jobs.tasks.Submitter"
我想这里最好的解决方案是如果工作者也将其视为"fable.jobs.tasks.Submitter",从应用程序的角度来看它更有意义.
CELERY_IMPORTS = ("fable.jobs.tasks", )
Run Code Online (Sandbox Code Playgroud)