python的"in"语言构造对于列表是线程安全的吗?

6 浏览
0 Comments

python的"in"语言构造对于列表是线程安全的吗?

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

这里是一份综合但不详尽的list操作示例清单,说明了它们是否是线程安全的,然而,我没有找到in语言结构的相关参考。

就Python实现而言,我使用的是CPython,但其他实现的答案对社区也是有帮助的。

0
0 Comments

Python的"in"语言结构用于判断一个元素是否在一个列表中。但是,有人提出了一个问题,即"在列表中使用'in'语句是否是线程安全的?"。这个问题的出现是因为,在CPython中,使用'in'语句操作列表时,只有在没有自定义的__contains__或__iter__钩子函数,且列表中的值不是通过在Python代码中实现的自定义__eq__钩子函数进行比较时,'in'操作才会完全在C中处理,并且只有一个opcode。这使得这个操作完全是线程安全的,因为Python线程只在opcode之间切换,而全局解释器锁(GIL)通常只在opcode之间解锁。

然而,如果你在一个自定义的C类型上使用'in'操作,而这个操作在测试包含性时会解锁GIL,那么它就不是线程安全的。换句话说,'in'操作的字节码测试是被锁定的,但是如果该操作需要调用Python代码(通过__contains__、在没有__contains__实现的情况下使用__iter__进行迭代,或者对值进行使用在Python中实现的__eq__钩子函数进行比较),那么该操作就不是线程安全的。

对于其他的Python实现,线程处理方式可能会有很大的差异。例如,Jython和IronPython没有全局解释器锁(GIL),因此你应该假设这个操作是不线程安全的。

0