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