私は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)
まずは可能でしょうか? もしそうなら、それを動作させるためにはどのような変更が必要ですか?
res_4を待たずにres_1にアクセスしたい、またはジョブが完了する前にlist_valuesにアクセスしたいという意味ですか? –
ジョブが完了する前にlist_valuesにアクセスしたい –
次に、値をダンプして読み込むことができる真実のソースが必要になります。単一のマシンで実行している場合は、ワーカーと親プロセスが両方アクセスできるグローバルなデータ構造を作成するのと同じくらい簡単です(通常は良い考えではありません。グローバルへのマルチスレッドアクセス権は非常に困難です)。よりよい解決策は、データベースのような外部の真実のソースを使用することです。私はこのようなものにredisを使用しています。つまり、ワーカーがデータ構造に値を追加し、親がそれを読み取り、redisがスレッドとアクセスの問題を処理します。 –