web-dev-qa-db-ja.com

同時に生成できるスレッドの数に制限はありますか?

昨日私はこの質問に出くわしました: pythonスクリプト内でrobocopyを呼び出して複数のフォルダーを一括コピーする方法はありますか? 、そしてそれはマルチスレッドの良い練習になるかもしれませんが。

コピーする必要があるファイルと同じ数のスレッドを生成しますが、各ルーチンには、コピープロセス全体のクラッシュを防ぐための例外処理システムがあります(エラーが発生した場合は、ログファイルでmutexを使用してログを記録します)。

私の質問:ほぼ同時に起動できるスレッドの数に制限はありますか?はいの場合、制限要因は何ですか?

私の質問はPCデスクトップに焦点を当てていますが、さまざまなハードウェア(組み込みシステム、微積分クラスターなど)での回答は歓迎します。

4
lucasg

簡単なgoogleクエリが明らかに この記事 Windowsのプロセスとスレッドの制限について。それはかなり完全なようです、そして同じシリーズの限界を押し上げることについての他の記事があります。

私はそれを読みませんでしたが、私が一見したところ、32ビットシステムでは2000スレッド強しか作成できず、メモリ(またはアドレス空間)が不足します。 32ビットプロセスには2GBのアドレス制限があります)。そして、それは何もしない空のスレッドのためだけです。

また、コピールーチンの場合、そのような膨大な数のスレッドを生成すると、パフォーマンスが低下します。大量のコンテキストの切り替えが行われるだけでなく、すべてのスレッドが同時にディスクから読み取ろうとしたため、ソースディスクがスラッシュされます。 SSDの方が良いかもしれませんが、システムが維持する巨大なIOキューを意味します。

全体として、ファイルコピー操作はマルチスレッドの恩恵を受けられないとは言っていませんが、各ファイルのスレッドを盲目的に作成しても解決しません何でも。コピー操作では、ボトルネックになるのはCPUではなく、ディスク(またはネットワーク経由でコピーする場合はネットワーク)だからです。したがって、どのような最適化でも、最初にこれらの問題に対処する必要があります。

5
Vilx-