3

我正在尝试在方法任务上运行 celerybeat,但无法正常工作。这是一个示例设置:

from celery.contrib.methods import task_method
from celery import Celery, current_app

celery=celery('tasks', broker='amqp://guest@localhost//')
celery.config_from_object("celeryconfig")
class X(object):
    @celery.task(filter=task_method, name="X.ppp")
    def ppp(self):
        print "ppp"

我的 celeryconfig.py 文件是

from datetime import timedelta
CELERYBEAT_SCHEDULE = {
      'test' : {
               'task' : 'X.ppp', 
               'schedule' : timedelta(seconds=5)
               }, 
 }

当我运行时celery beat,我收到如下错误:

 task X.ppp raised exception, TypeError('ppp() takes exactly 1 argument, (0 given)  

当我把这个方法变成一个普通函数并用`@celery.task'装饰它时,它确实有效,所以其余的设置似乎正在工作。我在文档中看到了有关方法任务的警告,但无法真正找出问题所在。有谁知道如何解决这个问题?

4

1 回答 1

4

问题是 Celerybeat 在调用方法之前不会实例化 X。如果方法未绑定到对象,则 task_method 过滤器默认调用未绑定方法。

我的问题是,你想在这里完成什么?X 没有状态,那么为什么不使用模块级函数呢?

于 2013-01-25T04:24:05.253 回答