让我们假设我有两个线程和一个带有线程模块的python代码中的单个全局变量。 在此代码中,只有thread-1修改全局变量的值,而thread-2只读取全局变量的值并根据该值执行其任务。
在这种情况下,我是否需要使用Lock()保护对全局变量的访问?在C中,必须在这种条件下使用互斥锁。然而,与GIL的python怎么样?还是这样吗?是否还需要Lock()?
答案 0 :(得分:11)
将对象值分配给全局变量是Python中的原子操作。其他线程无法通过在分配变量时读取它来错误地读取变量。 GIL在Python的C实现中保证了这一点,但是其他实现可以并且确实以不同的方式做出相同的保证。
如果全局变量是一个可变对象(如列表),并且您正在修改该对象,则它取决于您使用的方法。像列表这样的内置对象的大多数方法都是原子的。
我不能肯定地说你不需要锁定,但是不知道关于该变量的目的的更多细节以及你如何使用它。为什么thread-2需要根据该值改变其行为,如果thread-1在线程2做出决定之后更改了值,那么它是否正常?如果不行,您可能仍然需要锁定。
(C中的类似情况 - 为指针变量赋值 - 在正常情况下也是原子的,但指针赋值可以重新排序。在某些情况下可以使用它来避免C中的锁定。)