2016-08-18 6 views
1

私はPythonのエキスパートではありませんが、タスクを待つのではなく、部分的な結果にアクセスできる長期実行のセロリベースのタスクを開発しようとしています。終わり。 initial_range + 1 - 乗数、最初と最後の範囲、労働者を与え セロリのタスクの部分的な結果にアクセスする

あなたは以下のコードで見ることができるように

は、サイズ final_rangeのリストを作成します。

from celery import Celery 
app = Celery('trackers', backend='amqp', broker='amqp://') 

@app.task 
def worker(value, initial_range, final_range): 
    if initial_range < final_range 
     list_values = [] 
     for index in range(initial_frame, final_frame + 1): 
      list_values.append(value * index) 
     return list_values 
    else 
     return None 

ので、代わりに完了するために、すべての4労働者を待つので、私は、彼らが実際に返される前に-返された値(list_values)にアクセスしたいと思います。

from trackers import worker 

res_1 = worker.delay(3, 10, 10000000) 
res_2 = worker.delay(5, 01, 20000000) 
res_3 = worker.delay(7, 20, 50000000) 
res_4 = worker.delay(9, 55, 99999999) 

まずは可能でしょうか? もしそうなら、それを動作させるためにはどのような変更が必要ですか?

+0

res_4を待たずにres_1にアクセスしたい、またはジョブが完了する前にlist_valuesにアクセスしたいという意味ですか? –

+0

ジョブが完了する前にlist_valuesにアクセスしたい –

+1

次に、値をダンプして読み込むことができる真実のソースが必要になります。単一のマシンで実行している場合は、ワーカーと親プロセスが両方アクセスできるグローバルなデータ構造を作成するのと同じくらい簡単です(通常は良い考えではありません。グローバルへのマルチスレッドアクセス権は非常に困難です)。よりよい解決策は、データベースのような外部の真実のソースを使用することです。私はこのようなものにredisを使用しています。つまり、ワーカーがデータ構造に値を追加し、親がそれを読み取り、redisがスレッドとアクセスの問題を処理します。 –

答えて

0

SQLやRedis/Memcachedなどの外部ストレージを使用する必要があるのは、通常は異なるサーバーで異なるタスクを実行できるためです。

あなたの例では、list_valuesをいくつかのDBに格納し、ループ中に更新する必要があります。

+0

私はRedisがある種のメインメモリDB(ディスクにアクセスする必要はありません)であることを知りました。したがって、私はむしろレディスを使用したい、私はちょうど労働者の外で部分的な結果にアクセスする方法を知らない。 –

+0

このタスクにはRedisが適しています。また、各作業者は独立したOSプロセスなので、外部の誰も自分の記憶を読み取ることはできません。 Linux上でプロセス間通信を行うには、名前付きパイプ、共有メモリ(例えばtmpfsを使用)、ソケットなどを使用できます。使い方が簡単でスケーラビリティに優れているため、これらの方法はすべてあなたのケースでRedisに役立ちます。 – g1zmo

関連する問題