obj in a_list
是线程安全的,而 a_list
可能会在不同的线程中修改吗?
这是 list
操作的全面但非详尽的示例列表,以及它们是否是线程安全的,但是我找不到
in
语言构造的任何参考。在 python 实现方面,我使用 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,您应该假设操作是不是线程安全的。