Python中Java volatile的等价物

Python中Java volatile的等价物,java,python,volatile,Java,Python,Volatile,Python是否具有Javavolatile概念的等价物 在Java中有一个关键字volatile。据我所知,当我们在声明变量时使用volatile时,对该变量值的任何更改都将对同时运行的所有线程可见 我想知道Python中是否有类似的东西,以便在函数中更改变量的值时,所有同时运行的线程都可以看到它的值 据我所知,当我们在声明变量时使用volatile时,对该变量值的任何更改都将对同时运行的所有线程可见 volatile比这更微妙volatile确保Java在主内存中存储和更新变量值。如果没有v

Python是否具有Java
volatile
概念的等价物

在Java中有一个关键字
volatile
。据我所知,当我们在声明变量时使用
volatile
时,对该变量值的任何更改都将对同时运行的所有线程可见

我想知道Python中是否有类似的东西,以便在函数中更改变量的值时,所有同时运行的线程都可以看到它的值

据我所知,当我们在声明变量时使用volatile时,对该变量值的任何更改都将对同时运行的所有线程可见

volatile
比这更微妙
volatile
确保Java在主内存中存储和更新变量值。如果没有volatile,JVM可以自由地将值存储在CPU缓存中,这样做的副作用是,对值的更新对于在不同CPU内核上运行的不同线程是不可见的(在同一内核上并发运行的线程将看到该值)

Python从来没有这样做过。Python将所有对象存储在主内存中的堆上。此外,由于Python解释器循环如何使用锁定(GIL),每次只有一个线程将积极运行Python代码。不同的线程绝不可能在不同的CPU上运行Python解释器循环

因此,您不需要在Python中使用
volatile
,没有这样的概念,您也不需要担心它。

关键字“global”就是您想要的:

import threading

queue = []
l = threading.Lock()

def f():
    global queue
    l.acquire()
    queue.append(1)
    l.release()

def g():
    print(queue)

threads = [
    threading.Thread(target=f),
    threading.Thread(target=g)
]
for t in threads:
    t.start()
for t in threads:
    t.join()

谢谢,您的代码中的
queue=[]
怎么样?因为它是在所有函数之外声明的,所以它不也被认为是一个全局变量吗?关键字
global
允许您修改程序中其他地方绑定的变量。如果不这样做,您将只有
read
访问权限。这与
global
无关。OP所讨论的问题同样适用于实例的属性,这些属性在Python中是可见的,并且可以在Java中公开。此外,由于您从未尝试绑定到代码中的
队列
名称,
全局队列
语句是完全冗余的。它可以从你的例子中删除,在行为上没有区别。有趣。对于某些多线程应用程序来说,GIL是否会使Python速度变慢?GIL不是CPython的一个实现工件吗?@Dici:是的,CPython不能并行运行Python代码,只能并发运行。(从Python派生的本机代码不受此限制,因此numpy和其他扩展不受此限制)。@MarkrotVeel:是的,但是IronPython、Jython和PyPy也没有
volatile
,因为它们也只使用堆上的对象。我很讨厌。并行运行代码和并发运行代码有什么区别?你是说只要不修改共享数据,它就是并行的吗?