2017-01-10 12 views
0

私はcelery 4RabbitMQをブローカーとして使用しています。私はQueue(サイズ== 200)を制限しています。ブローカキューがいっぱいのときのPython Celery task.delay()

for i in range(200): 
    tasks.delay(i) 

私< =サイズの範囲ならばそれは動作します。私の主なコードは次のようになります。私はこのような何かを呼び出す場合:

for i in range(2000): 
    tasks.delay(i) 

そして、サイズ制限は200ですが、Queueがいっぱいになり、タスクの残りの部分はスキップされます。

誰でもこの状況を処理する方法を教えてください。私はQueueが無料になり、insert別の仕事まで待つ必要があります。

ありがとうございました

答えて

1

これはRabbitMQの動作です。 RabbitMQ docs

制限に達すると、新しいメッセージのためのスペースを確保するために、キューの前面からメッセージがドロップまたはデッドレターされます。

これを管理するには、RabbitMQでconfigを変更するか、複数のキューを使用できます。 これを修正する別の方法は、再試行値、ηまたはretry_policyを設定できるcelery's apply_asyncを使用することです。ところで、delay()はapply_async()のショートカットに過ぎません。

+0

完璧なおかげで、私はredisを使うと同じ問題が起こるのですか?キューが空きになるまで遅延が待っています。 – wilima

+0

私はレディスは少し違うと思います。 Redisはキー/バリューデータベースなので、RabbitMQというキューの概念は実際にはありません。つまり、Redisにはキュー制限はありませんが、Reisには、Redisに割り当てるメモリおよび/またはディスク領域の上限があります。 これはセロリがスケーリングに非常に優れているため、必要に応じてさらに多くの作業者を追加できるからです。希望がこれを助ける – xirdneh

+0

@wilima、btw。答えがあなたを助けてくれたら。それを正解とマークできますか?ありがとう。 – xirdneh

関連する問題