あなたの説明に基づいて、先に進んで、最大 20 のジョブに対して複数のプロセスを作成することをお勧めします。API を使用multiprocessing
すると、これが非常に簡単になります。最も貴重なリソースは自分の時間です。並行プログラミングの複雑さはすぐに手に負えなくなる可能性があるため、できる限りの支援が必要です。
詳細
ワーカー プロセスがI/O バウンドである場合、(ほぼ間違いなく) 多くのプロセスを使用しても CPU への影響はありません。私の Windows では、現在 145 の実行中のプロセスがリストされていますが、マシンはアイドル状態であると見なされます。コードが定期的に呼び出していることを確認してください。ここで、ポーリングの「妥当な」一時停止時間です。または、マルチプロセッシングの接続オブジェクトとそのメソッドなど、それを行うライブラリを使用していることを確認してください。time.sleep(x)
x
.poll(x)
ワーカー プロセスがCPU バウンドである場合は、空き CPU と同じサイズのプロセス プールを設定し、ジョブをキューにプッシュして、プール内のプロセスがキューからジョブを取得できるようにすることをお勧めします。 . multiprocessing
このパラダイムをうまくサポートしています。
ワーカーが異なる時間に CPU バウンドと I/O バウンドの両方になる可能性がある場合、注意が必要です。この場合、1 つのプロセスを CPU 作業用に予約 (専用) しておき、そのプロセスでジョブをキューから取り出し、他の多くの (I/O) プロセスでジョブを作成して作業キューにプッシュすることをお勧めします。1 つの CPU コアが処理できる速度を超えて作業が入ってくる場合は、2 つ目の専用コアを追加するか、キューに最大サイズを設定して、I/Oワーカーにキュー サイズを監視させ、新しい作業を追加できるかどうかを認識させます。
I/O バウンドのワーカーが非常に多い場合は、 asyncio、Twisted、gevent、eventlet、greenletなどのイベントベースのフレームワークに注目する必要があります。これは、生成された OS スレッドまたはプロセスごとに予約メモリ コストが発生し、数千のインスタンスになると、予約スペースが追加され始めるためです。一方、イベントベースのシステムは複数のスレッドを生成せず、I/O デバイス インターフェイスをループして、イベントに基づいてデータを蓄積するだけです。イベントベースのネットワーキングを使用すると、非常に多数の同時接続をサポートできます。
Windows では、複数のスレッドとプロセスの測定限界に関する優れた記事がここにあります。ドキュメントをすばやくスキャンすると、最大プロセス数に対して最大 10k の制限が見つかったことがわかります。私はこれが別の場所でThe 10k problemとして言及されているのを見たことがありますが、現在私が利用できるリファレンスはありません。
CPU バウンドのワーカーが多数ある場合は、分散コンピューティングを使用して、ジョブをさまざまな個別のマシンにプッシュする必要があります。 multiprocessing
これも API 経由でサポートされていManager
ますが、個人的な経験はありません。ZeroMQ は現在、分散メッセージングの処理で人気があるようです。