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には状態がないので、module-evel関数を使用してみませんか?

于 2013-01-25T04:24:05.253 に答える