obj in a_list
线程安全,而a_list
可能在另一个线程中被修改了吗?
list
in
次Here's a comprehensive yet non-exhaustive list of examples次操作以及它们是否是线程安全的,但我找不到{{1}}语言构造的任何引用。
就python实现而言,我使用CPython,但其他实现的答案对社区也有帮助。
答案 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,你应该假设该操作不线程安全。