等效于Python中的Java volatile

时间:2018-12-14 12:57:38

标签: java python volatile

Python等同于Java volatile概念吗?

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

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

2 个答案:

答案 0 :(得分:9)

  

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

volatile的细微之处远不止于此。 volatile确保Java在主存储器中存储和更新变量值 。如果没有volatile,JVM可以自由地将值存储在CPU缓存中,这对值的更新具有副作用,该更新对于在不同CPU内核上运行的不同线程(线程)不可见同时在同一内核上运行的计算机 会看到该值)。

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

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

答案 1 :(得分:-1)

您正在寻找关键字“ 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()