2013-11-01 40 views
8

obj in a_list线程安全,而a_list可能在不同的线程被修改?python的“in”语言是否构造线程安全的列表?

Here's a comprehensive yet non-exhaustive list of exampleslist操作以及它们是否线程安全,但我找不到in语言结构的任何参考。

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

+6

请注意,有关线程安全的任何声明都是特定于实现的(也可能是版本特定的)。除了获取和释放锁之外,假设没有什么是线程安全的可能更容易。 – delnan

回答

15

我假设你在这里使用CPython。

提供没有定制__contains____iter__钩在滴回成Python 您测试值针对包含列表使用Python代码实现的自定义__eq__钩,所述in操作者可完全用C处理,并且只是一个操作码。

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

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

在换言之:in字节码测试被锁定,但如果操作者需要调用Python代码(通过__contains__,与__iter__迭代时没有__contains__实现可用,或值是针对用Python实现__eq__钩检验) ,那么操作不是线程安全的。

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

+0

's/Python/CPython/g' – delnan