ここでCPythonを使用しているとします。提供
は、いかなるカスタム__contains__
またはリストは、Pythonコードで実装カスタム__eq__
フックを使用に含まに対してパイソン又はに戻って、テスト値をドロップ__iter__
フックは、in
オペレータがCで完全に処理することができるがありませんちょうど1つのオペコードです。
これにより、操作はスレッドセーフです。 Pythonスレッドのみスイッチとオペコードの間で切り替えます。 GIL(グローバルインタプリタロック)は、通常、オペコード間のロックを解除するだけです。
つまり、もしあなたがカスタムC型でin
を使っているのであれば、封じ込めをテストするときにGILをロック解除することはスレッドセーフではないでしょう。すなわち
:in
バイトコード・テストがロックされているが、オペレータがPythonコードを呼び出す必要がある場合(__iter__
で繰り返し、__contains__
通る__contains__
実装が利用できない、または値は、Pythonで実装__eq__
フックに対してテストされている場合)操作はスレッドセーフではありません。
他のPythonの実装では、スレッド処理の仕方が大きく異なる場合があります。確かに、JythonとIronPythonにはGILがありません。操作はではなく、スレッドセーフであると仮定してください。
スレッドの安全性に関する記述は実装固有のものであり、バージョン固有のものもあります。おそらく、ロックの取得と解放を除いてスレッドセーフであると仮定することは簡単でしょう。 – delnan