2013-02-15 29 views
6

Celery 3.0のチェーンを使用して作成された実行中のワークフローを一時停止/再開する方法はありますか?Django Celeryワークフローチェーンの一時停止/再開

基本的に私たちのシステムには、対話型と非対話型の2種類のタスクがあります。非対話型のものにはすべてのパラメータがありますが、対話型のものにはユーザー入力が必要です。インタラクティブタスクの場合、結果は対話型タスク(つまり、実際のチェーンを作成する前にユーザー入力を求めることはできません)に影響するため、チェーン内の以前のタスクがすべて完了したらユーザー入力のみを要求できます。

これにアプローチする方法についてのご意見はありますか?本当にここ損失で..

現在のアイデア:

  • (セロリのインポートタスクから)タスクの2つのサブクラスを作成します。対話型タスクのサブクラスに追加のインスタンス(クラスメンバ)変数を追加します。このサブクラスは、デフォルトでfalseに設定され、ユーザー入力がまだ必要であることを表します。どういうわけか(私はかなりこれを見ていると、タスクへのアクセスが別のモジュールから直接オブジェクトを持つことができていないようだけど)タスクのインスタンスへのアクセスを持っている、とセロリの労働者の外部からtrueに設定し
  • インタラクティブジョブによって区切られた複数のチェーンにチェーンを分割します。チェリーが終わりに達したら、セロリの作業員の外で何らかのメカニズムを検出して、インタラクティブタスクのインタラクティブなクライアントサイドコンポーネントを起動させます。ユーザーがすべてのデータを入力したら、データを取得して、新しいチェーンの先頭に対話型タスクがある新しいチェーンを開始します。

答えて

2

&プロジェクトで2番目のアイディアのようなものを実装しましたが、正常に動作します。ここに実装の要点があります。

は、保存方法、モデル&オーバーライドに新しいフィールドstatusを追加します。

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

パスstatusユーザーが情報を入力するためのUI要素を表示するのに便利なテンプレート変数。ユーザーが必要な情報を入力したら、ステータスを変更します。これはあなたのinteractive_taskトリガーcustom_funcを呼び出します。

関連する問題