Thread State and the Global Interpreter Lock:GIL I/O操作でスレッドがブロックされたときに、Pythonはスレッドを同時に実行しますか?
ロックは、他のPythonのスレッドがその間に実行できるように潜在的に、ファイルの読み込みや書き込みのようなI/O操作をブロックの周りに解放されます。 @Alexマルテッリによる
関連答えhereは言う:解決するためにI/Oブロックを待っている間に
はPythonのブロックI/OプリミティブのすべてがGILをリリース - それはそれと同じくらい簡単です!もちろん、Pythonコードを実行する前にGILを再度取得する必要がありますが、一部のI/Oシステムコールを待っているマシンサイクルの長期的な間隔については、 GILを必要としないので、彼らはそれを保持しません!
*これはopen
またはread
またはwrite
を阻止することが起こったとき、GILは、他のスレッドは、I/O操作と並行して実行するように解放されるということですか?
1つのスレッドまたは複数のスレッドがI/O操作でブロックされ、バイトコードを実行するスレッドが1つしかない場合、複数のスレッドが同時に実行される可能性があります。 I/O操作によってブロックされたスレッドの1つがPythonオブジェクトにアクセスする必要があるときは、まずGILを取得する必要があります。
あなたの最後の段落は混乱しています。マルチプロセッシングライブラリを使用していない限り、インタプリタは一度に1つのことしか実行しません。インタプリタがその作業を終えると、それはOSの手に入ります。 –
一度に1つのスレッドしか実行されません。 GILはこれを保証するために使用され、I/O中に解放されるか、または現在のスレッドが他の方法でブロックされて実行できないときに解放されます。 [** _Grok the GIL _ **](https://opensource.com/article/17/4/grok-gil)を参照してください。 – martineau
@minitotentスレッドAがI/O操作によってブロックされ、プロセスが複数のスレッドA、B、Cで構成されている場合、スレッドAはI/Oによってブロックされるため、GILは解放されますOSのスケジューラに応じてBまたはCを実行します。したがって、OSのスケジューラがスレッドBを実行することを決定した場合、スレッドAとBを同時に実行している2つのスレッドが存在することになります。 – direprobs