Pythonプロセスがどのプロセスにバインドされているかを知るにはどうすればよいですか?これらの同じ行だけで、子プロセスは親が現在実行しているのと同じコア(つまりCPU)で実行されますか?
1 に答える
プロセスとネイティブOSスレッドは、誰かが具体的にそれを要求した場合にのみ、特定のプロセッサにバインドされます。デフォルトでは、プロセスとスレッドは、使用可能な任意のプロセッサでスケジュールできます(スケジュールできます)。
最新のオペレーティングシステムはプリエンプティブマルチスレッドを使用しており、いつでもスレッドの実行を中断できます。そのスレッドが次に実行されるようにスケジュールされたときに、別のプロセッサで実行できます。これは、コンテキストスイッチとして知られています。スレッドの実行コンテキスト全体がオペレーティングシステムによって保存され、スレッドが再スケジュールされると、実行コンテキストが復元されます。
このため、答えはいつでも変わる可能性があるため、スレッドが実行されているプロセッサを尋ねるのは意味がありません。現在のスレッドのプロセッサを照会した関数の実行中でも。
この場合も、デフォルトでは、2つの別々のプロセスが実行されるプロセッサ間には関係がありません。2つのプロセスは、同じプロセッサまたは異なるプロセッサで実行できます。それはすべて、OSがさまざまなスレッドをスケジュールすることをどのように決定するかに依存します。
あなたが述べるコメントの中で:
Pythonプロセスは、GILロックのため、1つのコアでのみ実行されます。
その声明は単に間違っています。たとえば、Pythonコードのセクションは、GILを要求し、使用可能なすべてのプロセッサ間でコンテキストスイッチを取得してから、GILを解放します。
答えの冒頭で、プロセスまたはスレッドを特定のプロセッサにバインドする可能性をほのめかしました。たとえば、Windowsでは、とを使用してこれを行うことができSetProcessAffinityMask
ますSetThreadAffinityMask
。ただし、これを行うのは珍しいことです。CPUID
これを一度だけ行ったことを思い出すことができます。それは、特定のプロセッサで実行を確実に実行するためでした。通常の実行では、プロセスとスレッドはすべてのプロセッサと親和性があります。
別のコメントであなたは言う:
CPUのマルチコアを使用する子プロセスを作成しています。
その場合、心配する必要はありません。通常、論理プロセッサと同じ数のプロセスを作成します。OSスケジューラは賢明であり、それぞれの異なるプロセスを異なるプロセッサで実行するようにスケジュールします。したがって、利用可能なハードウェアリソースを最適に利用します。