2016-07-06 12 views
1

1つの抽象タスクに基づくいくつかのCeleryタスクがあるとします。すべてのCeleryタスクの実行時に何かを実行します

class BaseTask(Task): 
    abstract = True 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     logging.info('Task failed') 

    def on_success(self, retval, task_id, args, kwargs): 
     logging.info('Task success') 

    # NO SUCH METHOD IN TASK 
    # def on_start(self): 
    #  do_something_on_every_task_start() 

@app.task(base=BaseTask) 
def task1(x): 
    print x 

@app.task(base=BaseTask) 
def task2(y): 
    print y 

すべてのタスク実行の開始時に何かしたいですか?この結果を達成する可能性はありますか?ありがとう。

答えて

3

__call__メソッドをオーバーライドできます。これは、task1(1)と同時にタスクを呼び出す場合、またはtask1.delay(1)と非同期に呼び出す場合の両方で動作します。次の例では、「CALLED!」と表示されます。タスクの呼び出し方法とログの設定方法に応じてコンソールまたはログに表示されます。 「意味的に美しい」メソッドが必要な場合

class BaseTask(Task): 
    abstract = True 

    def __call__(self, *args, **kwargs): 
     print "CALLED!" 
     return super(BaseTask, self).__call__(*args, **kwargs) 

@app.task(base=BaseTask) 
def task1(x): 
    print x 

@app.task(base=BaseTask) 
def task2(y): 
    print y 
+0

[OK]を、ありがとう。私はそれが正しいと思うが、私はセロリプロジェクトから提供されるこれを行う意味的にもっと美しい方法がなぜ存在しないのだろうかと思っている... –

関連する問題