Python 的“in”语言构造对于列表来说是线程安全的吗?

问题描述 投票:0回答:1

obj in a_list
是线程安全的,而
a_list
可能会在不同的线程中修改吗?

这是 list

 操作的全面但非详尽的示例列表,以及它们是否是线程安全的,但是我找不到 
in
 语言构造的任何参考。

在 python 实现方面,我使用 CPython,但其他实现的答案对社区也很有帮助。

python list thread-safety in-operator
1个回答
18
投票
我假设您在这里使用 CPython。

如果没有自定义

__contains__

__iter__
 钩子回落到 Python 中 
或者 测试列表中包含的 的值使用在 Python 代码中实现的自定义 __eq__
 钩子,则 
in
 运算符可以是完全用 C 处理,并且只是 
one 操作码。

这使得操作完全线程安全; Python 线程仅在操作码之间切换; GIL(全局解释器锁)通常仅在操作码之间解锁。

也就是说,如果您在测试遏制时解锁 GIL 的自定义 C 类型上使用 in

则不是线程安全的。

换句话说:
in

字节码测试被锁定,但如果操作员需要调用Python代码(通过

__contains__

,当没有可用的
__iter__
实现时使用
__contains__
迭代,或者值针对
进行测试) __eq__
 用 Python 实现的钩子),则该操作不是线程安全的。
对于其他 Python 实现,处理线程的方式可能会有很大差异。当然,Jython 和 IronPython 没有 GIL,您应该假设操作是
不是

线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.