python的“in”语言是否构成了列表的线程安全?

时间:2013-11-01 13:31:45

标签: python list thread-safety in-operator

obj in a_list线程安全,而a_list可能在另一个线程中被修改了吗?

list inHere's a comprehensive yet non-exhaustive list of examples次操作以及它们是否是线程安全的,但我找不到{{1}}语言构造的任何引用。

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

1 个答案:

答案 0 :(得分:15)

我假设你在这里使用CPython。

如果没有自定义__contains____iter__挂钩回放到Python 您测试的值 列表中使用自定义__eq__运算符在Python代码中实现,in运算符可以完全用C语言处理,只是一个操作码。

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

也就是说,如果你在自定义C类型上使用in来解锁GIL,那么测试包含将不是线程安全的。

换句话说:in字节码测试被锁定,但是如果操作员需要调用Python代码(通过__contains__,则在没有__iter__实现时使用__contains__进行迭代是可用的,或者值是针对Python中实现的__eq__挂钩进行测试的,然后操作不是线程安全的。

对于其他Python实现,处理线程的方式可能有很大差异。当然,Jython和IronPython没有GIL,你应该假设该操作线程安全。