python - python的Threading模块下锁定全局变量

标签 python multithreading locking

让我们假设我在带有线程模块的 python 代码中有 2 个线程和一个全局变量。 在这段代码中,只有线程 1 修改了全局变量的值,而线程 2 仅读取全局变量的值并根据该值执行其任务。

在这种情况下,我是否需要使用 Lock() 来保护对全局变量的访问?在 C 中,必须在这种情况下使用互斥锁。但是,带有 GIL 的 python 呢?现在还是这样吗?还需要 Lock() 吗?

最佳答案

将对象值赋给全局变量是 Python 中的原子操作。其他线程不能通过在分配变量时读取它来错误地读取变量。 GIL 在 Python 的 C 实现中保证了这一点,但其他实现可以并且确实以不同的方式做出相同的保证。

如果全局变量是一个可变对象,比如一个列表,而你正在修改那个对象,这取决于你使用的方法。内置对象(如列表)的大多数方法都是原子的。

不过,我不能肯定地说您不需要锁,因为您不知道有关该变量的用途以及您如何使用它的更多详细信息。为什么线程 2 需要根据该值更改其行为,如果线程 1 在线程 2 做出决定后立即更改该值是否可以?如果不行,您可能仍需要一把锁。

(C 中的一个类似情况——为指针变量赋值——在正常情况下也是原子的,尽管指针赋值可以重新排序。在某些情况下你可以使用它来避免 C 中的锁。)

关于python - python的Threading模块下锁定全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9612484/

相关文章:

java - 可以暂停主线程或操作系统线程以提高并行计算速度吗?

database - 环回 : Atomic read and update

postgresql - postgres 锁表以避免读/写异常

python - 为什么decimal.Decimal对象不被认为是有理数?

python - 方法需要 'double *' 类型的参数?

python - matplotlib 中的 3D 离散热图

c++ - Windows Api 多线程消息

android - 如何使线程串联工作

mysql - 当有两个或多个进程同时请求它时,数据库如何决定它应该给哪个进程锁定?

python - 为什么我不能使用 pyCurl 发布到 Django?