2013-11-01 4 views
8

obj in a_listはスレッドセーフですが、a_listは別のスレッドで変更される可能性がありますか?pythonの "in"言語は、リストに対してスレッドセーフで構成されていますか?

Here's a comprehensive yet non-exhaustive list of exampleslistの操作と、スレッドセーフであるかどうかにかかわらず、in言語構成の参照が見つかりませんでした。

私はCPythonを使っていますが、他の実装にもコミュニティに役立つと答えています。

+6

スレッドの安全性に関する記述は実装固有のものであり、バージョン固有のものもあります。おそらく、ロックの取得と解放を除いてスレッドセーフであると仮定することは簡単でしょう。 – delnan

答えて

15

ここでCPythonを使用しているとします。提供

は、いかなるカスタム__contains__またはリストは、Pythonコードで実装カスタム__eq__フックを使用に含まに対してパイソン又はに戻って、テスト値をドロップ__iter__フックは、inオペレータがCで完全に処理することができるがありませんちょうど1つのオペコードです。

これにより、操作はスレッドセーフです。 Pythonスレッドのみスイッチオペコードの間で切り替えます。 GIL(グローバルインタプリタロック)は、通常、オペコード間のロックを解除するだけです。

つまり、もしあなたがカスタムC型でinを使っているのであれば、封じ込めをテストするときにGILをロック解除することはスレッドセーフではないでしょう。すなわち

inバイトコード・テストがロックされているが、オペレータがPythonコードを呼び出す必要がある場合(__iter__で繰り返し、__contains__通る__contains__実装が利用できない、または値は、Pythonで実装__eq__フックに対してテストされている場合)操作はスレッドセーフではありません。

他のPythonの実装では、スレッド処理の仕方が大きく異なる場合があります。確かに、JythonとIronPythonにはGILがありません。操作はではなく、スレッドセーフであると仮定してください。

+0

's/Python/CPython/g' – delnan

関連する問題