クラスのメソッドをDjango-celeryタスクとして使用し、@ taskデコレーターを使用してマークアップします。同じ状況が説明されています ここ 、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
ポインターが欠落していることを意味します。
詳しくは:
run()
からメソッドを実行できる可能性があります。メソッド、メソッド選択のためのキーとしていくつかの引数を使用しますが、それは私が望んでいるものではありません。self
引数としてメソッドに渡すと、メソッドの実行方法が変わりますnot通常の方法(テスト中)ご協力いただきありがとうございます!
Celeryは、バージョン3.0以降、メソッドをタスクとして使用するための実験的なサポートを提供しています。
このドキュメントはcelery.contrib.methods
にあり、注意すべきいくつかの注意事項にも言及しています。
http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html
注意してください:contrib.methods
のサポートはCeleryから削除されました4.0以降
Jeremy Satterfieldには、クラスベースのタスクを作成するためのクリーンでわかりやすいチュートリアルがあります。確認できます こちら 。
魔法は基本的に、次のようなrun()
メソッドを含むcelery.Task
クラスを拡張することです。
from celery import Task
class CustomTask(Task):
ignore_result = True
def __init__(self, arg):
self.arg = arg
def run(self):
do_something_with_arg(self.arg)
そして、次のようにタスクを実行します:
your_arg = 3
custom_task = CustomTask()
custom_task.delay(your_arg)
ignore_result = True
の部分が必要かどうかはわかりません。
次の場合:
a = A()
できるよ:
A.foo.delay(a, param0, .., paramN)
乾杯
私にとっては、これがself
をメソッドに渡すだけなので、動作するのはcelery.current_appだけです。
したがって、これは次のようになります。
from celery import current_app
from celery.contrib.methods import task_method
class A:
@current_app.task(filter=task_method, name='A.foo')
def foo(self, bar):
...
異なるクラスに同じ名前のメソッドがある場合、名前を使用する必要があります。