2016-11-11 5 views
1

これらの例に基づいて:セロリー4.0.0およびクラスベースのタスクワークフロー

http://shulhi.com/class-based-celery-task/;

https://blog.balthazar-rouberol.com/celery-best-practices

http://shulhi.com/class-based-celery-task/

Class based Task in django celery

私は似たものを作成したいと思います:

class CalculationWorker(Task): 

    def __init__(self, id_user): 
     self._id_user = id_user 
     self._user = get_object_or_404(User, pk=self._id_user) 

    # I need to understand if the bind work or if it's needed 
    def _bind(self, app): 
     return super(self.__class__, self).bind(celery_app) 

    def _retrieve_some_task(self): 
     # long calculation 

    def _long_run_task(self): 
     # long calculation 
     self._retrieve_some_task() 

    # Main entry 
    def run(self): 
     self._long_run_task() 


# 
def run_job(): 
    worker = CalculationWorker(id_user=323232) 
    task = worker.apply_async() 

ドキュメントはそれが可能だと言っているようだ(とにかく、それは私にははっきりしていない)http://docs.celeryproject.org/en/latest/userguide/tasks.html#custom-task-classes 。それも、こう述べています。

「」」 これはのinitコンストラクタは一度だけプロセスごとに呼び出され、タスククラスは俳優と意味的に近いことをされることを意味 。 『』

が、明示的にhttp://docs.celeryproject.org/en/latest/whatsnew-4.0.html#the-task-base-class-no-longer-automatically-register-tasks

は、私が原因このhttps://github.com/celery/celery/issues/3548にNotRegistered例外を得た結果、「ベストプラクティスは、唯一の一般的な動作をオーバーライドするためのカスタムタスククラスを使用して、タスクを実現するためのタスクのデコレータを使用することである」が、app.tasks.register(CalculationWorker())のdidnを追加:言いますそれを解決しないでください。 私はDjango 1.10.XとCelery 4.0.0を使用しています

このアプローチはまだ有効ですか?

おかげ

答えて

2

私はこれが最善の解決策であるかどうかわからないんだけど、あなたが望む動作を取得するための回避策を使用することができます。似たようなことをしているので、タスクにエラーハンドラをより明確に適用することができます。

のベストプラクティスだけ 一般的な動作をオーバーライドして、 タスクを実現するために、タスクデコレータを使用するためのカスタムタスククラスを使用することです1

ドキュメントから:

@app.task(bind=True, base=CustomTask) 
def custom(self): 
    print('running') 

しかし、すべてのタスクコードをCustomTaskに入れて、装飾されたタスク宣言にスタブを残すことができます。あなたはそのようなスタブであなたのタスクのスーパークラスに呼び出す必要があります:

@app.task(bin=True, base=CustomTask) 
def custom(self, *args): 
    super(type(self), self).run(*args) 

あなたはその後、セロリのタスク登録機械に呼び出す方法として飾ら関数宣言を扱います。私は何かクリーナーが5.0に出てくることを願っています。

4

あなたはセロリ-4.0.1を使用する場合は、あなたがchris 1docs

を指摘Taskクラスは、もは​​や自動的にタスクレジストリにタスクを登録し、特殊なメタクラスを使用しているマニュアルを確認べきではありません。

今、あなたはこの

class CustomTask(Task): 
    def run(self): 
     print('running') 
app.register_task(CustomTask()) 
のようなあなたのタスクを登録する必要があります