在cherrypy中启动celery任务

1 投票
1 回答
1353 浏览
提问于 2025-04-17 13:01

我正在使用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。我能够重现你的问题,以上的解决办法对我有效。

希望这能帮到你。

撰写回答