6

OS が Python コールバックを呼び出す別のスレッドをディスパッチするときに、唯一の Python インタープリターがバイトコードの実行中にある場合、何が起こりますか? この設計の信頼性について心配するのは正しいですか?

4

1 に答える 1

3

一般的な状況では、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)。

于 2012-08-25T00:39:10.267 に答える