2016-12-08 11 views
0

考えると2つのタスク、ないいくつかの作業を行い1と別のクリーンアップ:セロリキャンバスで単一のグループのエラー伝搬を無効にするにはどうすればよいですか?

@app.task 
def work(): 
    ... 

@app.task 
def cleanup(): 
    ... 

作業タスクのグループに関係なく、かどうかのうちの1つまたは複数の、完了した後、私はクリーンアップタスクの実行を持っているしたいのですが作業タスクが失敗します。それが動作するようには思えない、

work_group = group([work.s() for i in range(0, 10)], propagate=False) 
work_and_cleanup = chain(work_group, cleanup) 

しかし:私はcanvas.apply_async(propagate=False)を実行することによって動作するようにこれを得ているが、私は実際には単一のグループのための伝搬をオフにします。 work_groupの伝播を拒否するにはどうすればよいですか?

答えて

0

タスクが成功した場合にのみチェーン、クリーンアップタスクをコールするためのリンクエラーコールバックを追加します。

work_and_cleanup.apply_async(link_error=cleanup.si()) 
+0

これは確かに機能しますが、実装するのは難しいでしょう。このアプローチでは、クリーンアップが進行中のタスクにまだ必要な共有リソースを無差別に削除するのを防ぐために、何らかのタイプの本を保管する必要があります。 – matthewatabet

+0

各作業タスクの使用方法セットに対して、伝播をFalseに設定する。 – Jinje

+0

たとえば、 work_group = group([work.s()。範囲(0、10)]のiに対してset(propagate = False)) – Jinje