2016-08-25 7 views
6

これは一般的な質問で、thisのような関連する質問がありますが、今はセロリを使用していないため、シナリオに合わせるための最善の方法を尋ねます。デーモンプロセスは子供を持つことができません

私のサービスのシナリオでは、マルチキャンペーンを使用して複数のキャンペーンの注文を作成します。各キャンペーンの注文では、マルチプロセッシングを使用しています。複数の広告(キャンペーンと広告は1toMの関係)を作成します。

ご存じのように、キャンペーンと広告作成の両方で複数のプロセスを設定すると、デーモンプロセスでは子プロセスを使用できないため、失敗します。それを今使った。

私の質問は、この種の問題を解決する一般的な方法は何ですか?私はセロリをまだ使用する必要がありますか、それを回避する方法はありますか?

どうもありがとう

答えて

0

1.一般的な良い回避策

あなたは、

  1. 、例えば

    を分離するために、メインプログラムをメッセージ・キューを使用してタスクを作成するにプッシュする必要がありますqueue_1

  2. マルチキャンペーンワーカーgetタスクをqueue_1から処理して、一部をmulti-ad taskからqueue_2に転送します。

  3. 複数の広告ワーカーは、queue_2、process、doneからタスクを取得します。

ロジックは簡単で、自分で実装するのが簡単です。また、そのようなもののためのいくつかの既存のライブラリ、例えばrq/celeryがあります。

2.簡単な回避策

取得する場合AssertionError、使用糸の代わりに

def run_in_subprocess(func, *args, **kwargs): 
    from multiprocessing import Process 
    thread = Process(target=func, args=args, kwargs=kwargs) 
    thread.daemon = True 
    thread.start() 
    return thread 

def run_in_thread(func, *args, **kwargs): 
    from threading import Thread 
    thread = Thread(target=func, args=args, kwargs=kwargs) 
    thread.daemon = True 
    thread.start() 
    return thread 

def run_task(config): 
    try: 
     run_in_subprocess(xxxx_task, config) 
    except AssertionError: 
     print('daemonic processes are not allowed to have children, use thread') 
     run_in_thread(xxxx_task, config) 

私はいくつかのデモアプリケーションでこのコードを使用しますが、私は生産に使用することはお勧めしません。

関連する問題