在cherrypy中启动celery任务
我正在使用cherrypy构建一个RESTful接口,并且需要启动一些celery任务。
但是似乎没有成功,我也不知道为什么。
也许有人遇到过类似的问题。
我有一个celeryconfig.py文件。
CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "sqlite:///celerydb.sqlite"
CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_ENGINE_OPTIONS = {"echo": True}
BROKER_TRANSPORT = "sqlalchemy"
BROKER_HOST = "sqlite:///celerydb.sqlite"
还有一个tasks.py文件。
from celery.task import task
@task
def create_agent(agent_id):
print ("do something")
我正在启动celeryd。
celeryd -l INFO
另外,我还有一个请求处理器(CherryPy)。
class Resource(object):
def POST(self):
create_agent.delay(1)
我可以在Python控制台中调用create_agent.delay(1)这个任务,celery工作进程能接收到任务并执行。
但是当我在cherrypy中调用create_agent.delay(1)(通过访问相应的URL)时,celery工作进程根本没有接收到任务。
还有,我使用的是python3.2。
1 个回答
4
如果你在调试模式下运行celeryd(使用命令celeryd -l debug
),你应该能得到一些提示:
[2012-02-15 09:34:35,484: ERROR/MainProcess] Received unregistered task of type 'default.create_agent'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you are using relative imports? Please see http://bit.ly/gLye1c for more information.
(为了将来参考,当你遇到类似问题时,记得在debug
模式下运行celeryd;info
模式不会给你太多有用的信息。)
那个bit.ly的链接指向这个页面: http://ask.github.com/celery/userguide/tasks.html#automatic-naming-and-relative-imports
你可以通过把你的装饰器改成这样来解决这个错误:
@task(name='tasks.create_agent')
我使用的是python 2.7和celery 2.3.1。我能够重现你的问题,以上的解决办法对我有效。
希望这能帮到你。