10

別のスレッドで変更される可能性がありますが、obj in a_listスレッドセーフですか?a_list

操作の例とそれらがスレッドセーフであるかどうかの包括的ではあるが網羅的ではないリストを次に示しますが、言語構造listの参照は見つかりませんでした。in

Python の実装に関しては、私は CPython を使用しますが、他の実装に関する回答はコミュニティにとっても役立ちます。

4

1 に答える 1

17

ここでは CPython を使用していると仮定します。

Python にドロップバックするカスタム__contains__またはフックがない場合、またはリストに含まれる値に対してテストする値がPython コードで実装されたカスタム フックを使用している場合、演算子は完全に C で処理でき、1 つのオペコードにすぎません。__iter____eq__in

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

inとはいえ、コンテインメントをテストするときに GIL のロックを解除するカスタム C 型で使用すると、スレッドセーフではなくなります。

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

他の Python 実装では、スレッド化の処理方法が大きく異なる可能性があります。確かに、Jython と IronPython には GIL がなく、操作がスレッド セーフではないと想定する必要があります。

于 2013-11-01T13:37:21.587 に答える