あなたの問題は古典的なもので、長年の仕事をしていた誰もがこれに会いました。
根本的な原因は、各作業者のタスクを予約して実行フローを最適化しようとしていることです。しかし、これらのタスクのうちの1つが長時間実行されていると、他のタスクはロックされます。これは「プリフェッチカウント」として知られています。これは、デフォルトのセロリが短いタスク用に設定されているためです。
もう1つの関連する設定は「遅れている」です。デフォルトでは、ワーカーはキューからタスクを受け取り、ただちに「確認応答」信号を送信し、ブローカはこのタスクをキューから削除します。しかし、これは、このワーカーにとってより多くのメッセージがプリフェッチされることを意味します。 'late ack'を有効にすると、タスクが完了した後にのみ肯定応答を送信するようにワーカーに指示します。
これは2語に過ぎません。あなたはread more about prefetch and late ackかもしれません。また、
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
: - (3.xの2.xの)
task_acks_late = True
worker_prefetch_multiplier = 1
または以前のバージョンのために: - 溶液として
は単にこれらの設定(セロリ4.xを)使用しますパラメータ-0fair
を使用して作業者を開始することは同じです。