52

@task デコレータを使用してマークアップし、django-celery タスクとしてクラスのメソッドを使用しようとしています。Anand Jeyahar の質問に、同じ状況がここに記載されています。こんな感じです

class A:
    @task
    def foo(self, bar):
        ...

def main():
    a = A()
    ...
    # what i need
    a.foo.delay(bar) # executes as celery task 
    a.foo(bar) # executes locally

a.foo.delay(bar)問題は、このようにクラスインスタンスを使用してもfoo、少なくとも2つの引数が必要であり、selfポインターが見つからないことです。

詳しくは:

  • 継承のため、クラスをモジュールに変換できません
  • メソッドはクラスメンバーに強く依存するため、静的にすることはできません
  • @taskデコレータでクラスをタスクとしてマークすると、クラスがタスク自体になり、メソッド選択のキーとしていくつかの引数を使用して、メソッドからメソッドを実行できる可能性がありますrun()が、それはまさに私が望むものではありません。
  • クラスのインスタンスを作成し、それを引数としてメソッドに渡すと、メソッドをセロリタスクとしてではなく、通常のメソッドとして (つまり、テスト中に)実行selfする方法が変わります。
  • たとえば、コンストラクターからタスクを動的に登録する方法を見つけようとしましたが、セロリはワーカー間でコードを共有するため、不可能に思えます。

ご協力いただきありがとうございます!

4

5 に答える 5

53

Celery は、バージョン 3.0 以降、メソッドをタスクとして使用するための実験的なサポートを提供しています。

これに関するドキュメントは にcelery.contrib.methodsあり、注意すべきいくつかの注意事項についても言及しています。

https://docs.celeryproject.org/en/3.1/reference/celery.contrib.methods.html

注意: 4.0 以降contrib.methodsの Celery からの削除のサポート

于 2012-02-13T13:36:08.063 に答える
4

あなたが持っているとき:

    a = A()

できるよ:

    A.foo.delay(a, param0, .., paramN)

乾杯

于 2012-07-03T18:22:25.083 に答える