相当于Python中的Java易失性

2022-09-02 01:06:16

Python是否具有与Java概念等效的特性?volatile

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

我想知道Python中是否有类似的东西,这样当变量的值在函数中更改时,其值将对同时运行的所有线程可见。


答案 1

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

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

Python从来不这样做。Python 将所有对象存储在主内存中的堆上。此外,由于Python解释器循环使用锁定(GIL)的方式,一次只有一个线程会主动运行Python代码。不同的线程永远不会在不同的CPU上运行Python解释器循环。

所以你不需要在Python中使用,没有这样的概念,你也不需要担心它。volatile


答案 2

关键字“全局”是您要查找的内容:

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()