假设我在带有线程模块的python代码中有两个线程和一个全局变量。在这段代码中,只有thread-1修改全局变量的值,而thread-2仅读取全局变量的值并根据该值执行任务。
在这种情况下,我是否需要使用Lock()来保护对全局变量的访问?在C中,互斥必须在这样的条件下使用。但是,python和GIL如何呢?现在还是这样吗?仍然需要Lock()吗?
发布于 2012-03-08 14:20:28
在Python中,将对象值赋给全局变量是一个原子操作。其他线程不能通过在赋值时读取变量来错误地读取该变量。GIL在Python的C实现中保证了这一点,但其他实现可以而且确实以不同的方式提供相同的保证。
如果全局变量是一个可变对象,例如列表,并且您正在修改该对象,则它取决于您使用的方法。像lists这样的内置对象上的大多数方法都是原子的。
不过,如果不知道该变量的用途以及如何使用它的更多细节,我就不能肯定地说你不需要锁。为什么thread-2需要根据这个值改变它的行为,如果thread-1在thread-2做出决定后立即改变了这个值,可以吗?如果它不正常,您可能仍然需要一个锁。
(C中类似的情况-为指针变量赋值-在正常情况下也是原子的,尽管指针赋值可以重新排序。在某些情况下,您可以使用它来避免C中的锁。)
https://stackoverflow.com/questions/9612484
复制相似问题