@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
する方法が変わります。 - たとえば、コンストラクターからタスクを動的に登録する方法を見つけようとしましたが、セロリはワーカー間でコードを共有するため、不可能に思えます。
ご協力いただきありがとうございます!