我想知道 Java 的“volatile”的等价物,并找到了这个答案。
这(基本上)说,由于 GIL,至少在 cpython 中,所有东西在 python 中都是有效的。这是有道理的,一切都被 GIL 锁定,没有内存障碍需要担心,等等。但如果这是由规范记录和保证的,我会更高兴,而不是让它成为 cpython 目前碰巧的方式的结果实施的。
因为,假设我希望一个线程发布数据而其他线程读取它,所以我可以选择这样的东西:
class XFaster:
def __init__(self):
self._x = 0
def set_x(self, x):
self._x = x
def get_x(self, x):
return self._x
class XSafer:
def __init__(self):
self._x = 0
self._lock = threading.Lock()
def set_x(self, x):
with self._lock:
self._x = x
def get_x(self, x):
with self._lock:
return self._x
我宁愿使用XFaster甚至根本不使用 getter 和 setter。但我也想可靠地、“正确地”做事。是否有一些官方文件说这是可以的?比如说将值放入 adict或附加到 a怎么样list?
换句话说,是否有一种系统的、有记录的方法来确定我可以做什么而无需threading.Lock(无需深入挖掘dis或类似的东西)?并且最好以不会破坏未来 python 版本的方式。
关于编辑:我感谢评论中的知情讨论。但我真正想要的是一些保证以下内容的规范:
如果我执行这样的事情:
# in the beginning
x.a == foo
# then two threads start
# thread 1:
x.a = bar
# thread 2
do_something_with(x.a)
我想确定:
当线程 2 读取时,x.a
它读取foo
或者bar
如果线程 2 中的读取发生在物理上晚于线程 1 中的分配,那么它实际上读取bar
以下是一些我不想发生的事情:
线程被安排在不同的处理器上,x.a=bar
线程 1 的分配对线程 2 不可见
x.__dict__
正在重新散列,因此线程 2 读取垃圾
ETC
湖上湖
相关分类