我正在使用Flask运行REST服务器,我有一个方法可以更新其他方法只读取的一些变量。我希望能够安全地更新这些变量,但我不确定如何处理这个:
答案 0 :(得分:0)
我认为锁定可能就是你想要的;如何使用一个的例子如下:
from threading import RLock
class App(object):
def __init__(self):
self._lock = RLock()
self._thing = 0
def read_thing(self):
with self._lock:
print self._thing
def write_thing(self)
with self._lock:
self._thing += 1
所以,让我们想象一下我们(App)的这个对象是创建的,然后从两个不同的线程(例如两个不同的请求)访问; lock对象以上下文管理方式使用(" with"关键字),以确保所有可能是线程不安全的操作都在锁内完成。
在低级别的某个地方,我们会做一些魔术来确保在持有锁定期间,该变量没有其他任何事情发生。
这意味着我们可以在尽可能多的线程中将read_thing和write_thing发送到我们心中的内容,我们不应该破坏任何内容。
因此,对于您的Flask应用程序,声明一个锁,然后每当您访问那些您担心的变量时,请在锁内执行此操作。
注意:如果你正在使用字典,请务必复制字典(" copy.deepcopy"是单向的),否则你将传递一个引用实际的字典,你将回到线程不安全。