Jon*_*han 8 python list thread-safety in-operator
是否可以在不同的线程中修改obj in a_list线程安全a_list?
这是一个全面但非详尽的list操作示例列表,以及它们是否是线程安全的,但我找不到任何in语言结构的参考.
在python实现方面,我使用CPython,但其他实现的答案对社区也有帮助.
Mar*_*ers 15
我假设你在这里使用CPython.
如果没有自定义__contains__或__iter__挂钩回退到Python 或列表中包含的值,则使用__eq__Python代码中实现的自定义挂钩,in运算符可以完全用C语言处理,并且只是一个操作码.
这使得操作完全是线程安全的; Python线程只在操作码之间切换; GIL(全局解释器锁)通常只在操作码之间解锁.
也就是说,如果您使用in自定义C类型,在测试包含时解锁GIL将不是线程安全的.
换句话说:in字节码测试被锁定,但是如果操作员需要调用Python代码(通过__contains__迭代,__iter__当没有__contains__可用的实现,或者值是针对__eq__Python中实现的钩子进行测试时),则操作不是线程安全的.
对于其他Python实现,处理线程的方式可能有很大差异.当然,Jython和IronPython没有GIL,你应该假设操作不是线程安全的.