OS が Python コールバックを呼び出す別のスレッドをディスパッチするときに、唯一の Python インタープリターがバイトコードの実行中にある場合、何が起こりますか? この設計の信頼性について心配するのは正しいですか?
1 に答える
一般的な状況では、C ライブラリは、PyEval_InitThreads()
Python コールバックを呼び出すスレッドを生成する前に、呼び出して GIL を取得する必要があります。また、安全な実行を確保するためにPyGILState_Ensure()
、コールバックを囲む必要があります。PyGILState_Release()
ただし、C ライブラリがたとえば python C 拡張機能のコンテキスト内で実行されている場合、GIL 操作をまったく省略しても安全な単純なケースがあります。
この呼び出しシーケンスを考えてみましょう: 1) Python コードが C 関数を呼び出しfoo()
、2)別の C 関数を実行するスレッドを1 つだけfoo()
生成し、Python コードにコールバックし、3)戻る前に実行中のスレッドに常に参加またはキャンセルします。bar()
foo()
bar()
このような場合、GIL 操作を省略しても安全です。はそのライフサイクル中に GILfoo()
を所有し (つまり、それを呼び出す python コードから暗黙的に借用)、 のライフサイクル内での python コールバックの実行foo()
はシリアル化されているためです (つまり、コールバック スレッドは 1 つだけで、python コードは を組み込みませんthreading
)。