私は、数百のワーカーを並行して使用するシステムに取り組んでいます (小さなタスクを評価する物理デバイス)。一部のワーカーは他のワーカーよりも高速であるため、事前に速度を知らなくてもタスクの負荷を分散する最も簡単な方法を考えていました。
ワーカーが現在取り組んでいるタスクの数を単純なカウンターで追跡し、リストを並べ替えて、アクティブなタスク数が最も少ないワーカーを取得することを考えていました。このようにして、遅いワーカーはいくつかのタスクを取得しますが、システム全体を遅くすることはありません. 私が質問している理由は、現在のラウンド ロビン方式では、タスクを蓄積し続けて新しいタスクをブロックし続ける非常に遅いワーカー (他のワーカーよりも 100 倍遅い) が滞っているからです。
現在アクティブなタスクの数に従ってリストをソートするのは簡単なことですが、リストを1秒間に数回ソートすることになるため(タスクあたりの平均作業時間は25ミリ秒未満です)、これが大きなボトルネックになるのではないかと心配しています. 何度も何度も並べ替えることなく、タスク数が最も少ないワーカーを取得する簡単なバージョンがあります。
EDIT : タスクは、開いている TCP 接続を介してワーカーにプッシュされます。タスク間の依存関係はかなり複雑 (排他的なリソース使用) であるため、すべてのタスクが最初から割り当てられているとしましょう。タスクがワーカーから戻るとすぐに、ブロックされていないすべてのタスクがキューに入れられ、新しいタスクがワーカーにプッシュされます。ワーク キューが空になることはありません。