2017-02-24 13 views
2

私はセロリとレディスが初めてです。セロリ複数の労働者が1つのキューを持っています

redis-serverを使用して私の赤いサーバを起動しました。

セロリは、他の構成はありません

celery -A proj worker 

このパラメータを使用して実行されました。しかし、セロリで長時間実行されているジョブを実行すると、長時間実行されるタスクが完了するまで待ち行列にある別のタスクは処理されません。私の理解は、私は私のCPU上に8コアを持っているので、-cのデフォルトのパラメータはコアの数なので、同時に8つのタスクを処理できるはずですか?

ここに何か不足していますか?

答えて

4

あなたの問題は古典的なもので、長年の仕事をしていた誰もがこれに会いました。

根本的な原因は、各作業者のタスクを予約して実行フローを最適化しようとしていることです。しかし、これらのタスクのうちの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を使用して作業者を開始することは同じです。

関連する問題