Python拡張機能は、Cython/Pyrex Threadsafeによって生成されますか?
-
22-09-2019 - |
質問
そうでない場合、特定の方法でプログラミングすることでスレッドの安全性を保証できる方法はありますか?
明確にするために、「ThreadSafe」について話すとき、私はOSレベルのスレッドではなく、Pythonスレッドを意味します。
解決
詳細に文書化されているように、それはすべて、CythonコードとPythonのギルの間の相互作用に依存します ここ. 。特別なことをしないと、Cythonで生成されたコードはGILを尊重します(GILリリースマクロを使用しないCコード化された拡張機能と同様)。このようなコードは「PythonコードのようなThreadSafeなど」になります。これはそれほど多くはありませんが、完全にフリースレッドコードよりも処理する方が簡単です(理想的にはキューインスタンスとともに、マルチスレッドの協力と同期を作成する必要がありますが、おそらくロック&c)。
ギルを放棄し、まだ取得していないコードは、PythonランタイムとPythonランタイムが使用するオブジェクトといかなる方法でも相互作用してはなりません。これは、Cコード付き拡張機能と同様にCythonにも当てはまります。もちろん、そのようなコードは別のコアで実行できることです(もちろん、同期するか、Pythonランタイムと再び通信する必要があるまで)。
他のヒント
Pythonのグローバルインタープリターロックは、一度にインタープリターでアクティブにできるスレッドのみが1つのスレッドのみができることを意味します。ただし、制御がC拡張機能に渡されると、別のスレッドがインタープリター内でアクティブになります。複数のスレッドを作成でき、重要なセクションの中央でスレッドが中断されるのを防ぐものはありません。 n
スレッドセーフコードでは、インタープリター内で実装できるため、インタープリター内で実行されているコードについては、本質的に安全にはありません。 CまたはPyrexモジュールのコードは、Pythonコードに表示されるデータ構造を変更できます。もちろん、ネイティブコードには、ネイティブデータ構造に関するスレッドの問題もあります。
適切な設計と同期を使用してスレッドの安全性を保証することはできません。Pythonインタープリターのギルはこれを大幅に変更しません。