是obj in a_list
线程安全,而a_list
可能在不同的线程被修改?python的“in”语言是否构造线程安全的列表?
Here's a comprehensive yet non-exhaustive list of examples的list
操作以及它们是否线程安全,但我找不到in
语言结构的任何参考。
就python实现而言,我使用CPython,但是其他实现的答案对于社区也是有帮助的。
是obj in a_list
线程安全,而a_list
可能在不同的线程被修改?python的“in”语言是否构造线程安全的列表?
Here's a comprehensive yet non-exhaustive list of examples的list
操作以及它们是否线程安全,但我找不到in
语言结构的任何参考。
就python实现而言,我使用CPython,但是其他实现的答案对于社区也是有帮助的。
我假设你在这里使用CPython。
提供没有定制__contains__
或__iter__
钩在滴回成Python 或您测试值针对包含列表使用Python代码实现的自定义__eq__
钩,所述in
操作者可完全用C处理,并且只是一个操作码。
这使得操作完全是线程安全的; Python线程仅在操作码之间切换; GIL(全局解释器锁)通常只在操作码之间解锁。
也就是说,如果您在自定义C类型上使用in
来解锁GIL,那么测试遏制将不是线程安全的。
在换言之:in
字节码测试被锁定,但如果操作者需要调用Python代码(通过__contains__
,与__iter__
迭代时没有__contains__
实现可用,或值是针对用Python实现__eq__
钩检验) ,那么操作不是线程安全的。
对于其他Python实现,处理线程的方式可能差异很大。当然,Jython和IronPython没有GIL,并且您应该假设操作是而不是线程安全。
's/Python/CPython/g' – delnan
请注意,有关线程安全的任何声明都是特定于实现的(也可能是版本特定的)。除了获取和释放锁之外,假设没有什么是线程安全的可能更容易。 – delnan