为什么芹菜在Python shell中工作,但不在我的Django视图中? (import问题)

我安装了芹菜(最新的稳定版本)。我有一个名为/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工作者,然后我尝试一下。 我打开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 

有人可以帮忙吗?

我相信你的tasks.py文件需要在django应用程序(这是在settings.py注册)才能被导入。 或者,您可以尝试从主项目或其中一个应用程序的__init__.py文件导入任务。

另外尝试从manage.py启动celeryd:

 $ python manage.py celeryd -E -B -lDEBUG 

-E-B可能也可能不需要,但这就是我使用的)。

这是我做了最后的工作

在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。 您必须在客户端和服务器上注册名称。

🙂

请参阅文档中的自动命名和相对导入:

http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

任务名称是“tasks.Submitter”(在芹菜输出中列出),但是您将任务导入为“fable.jobs.tasks.Submitter”

我想这里最好的解决方案是,如果工作人员也把它看作“fable.jobs.tasks.Submitter”,从应用程序的角度来看更有意义。

 CELERY_IMPORTS = ("fable.jobs.tasks", )