そうでない場合、特定の方法でプログラミングすることでスレッドセーフを保証できる方法はありますか?
明確にするために、「スレッドセーフ」とは、OSレベルのスレッドではなく、Pythonスレッドを意味します。
そうでない場合、特定の方法でプログラミングすることでスレッドセーフを保証できる方法はありますか?
明確にするために、「スレッドセーフ」とは、OSレベルのスレッドではなく、Pythonスレッドを意味します。
これはすべて、ここで詳細に説明されているように、CythonコードとPythonのGILの間の相互作用に依存します。特別なことを何もしなければ、Cythonで生成されたコードはGILを尊重します(GILを解放するマクロを使用しないCコード化された拡張機能も同様です)。これにより、このようなコードは「Pythonコードと同じくらいスレッドセーフ」になります。これはそれほど多くはありませんが、完全にフリースレッドのコードよりも処理が簡単です(マルチスレッドの連携と同期を設計する必要があります。理想的にはキューインスタンスを使用しますが、場合によってはロック&c)。
GILを放棄し、まだ取得していないコードは、PythonランタイムおよびPythonランタイムが使用するオブジェクトと相互作用してはなりません。これはCythonだけでなく、Cコード化された拡張機能にも当てはまります。もちろん、そのようなコードは別のコアで実行できるという利点があります(もちろん、同期する必要があるか、Pythonランタイムと再度通信する必要があるまで)。
Python のグローバル インタープリター ロックは、一度に 1 つのスレッドしかインタープリターでアクティブにできないことを意味します。ただし、制御が C 拡張に渡されると、インタプリタ内で別のスレッドがアクティブになる可能性があります。複数のスレッドを作成することができ、クリティカル セクションの途中でスレッドが中断されることを妨げるものは何もありません。N
スレッドセーフなコードはインタープリター内で実装できるため、インタープリター内で実行されるコードは本質的にスレッドセーフではありません。C または Pyrex モジュールのコードは、Python コードに表示されるデータ構造を変更できます。もちろん、ネイティブ コードでも、ネイティブ データ構造のスレッド化の問題が発生する可能性があります。
適切な設計と同期を使用する以外に、スレッドの安全性を保証することはできません。Python インタープリターの GIL は、これを実質的に変更しません。