Flask:在处理某个请求时暂停其他请求

时间:2017-05-16 10:59:50

标签: python python-2.7 flask

我正在使用Flask运行REST服务器,我有一个方法可以更新其他方法只读取的一些变量。我希望能够安全地更新这些变量,但我不确定如何处理这个:

  • 是否有一些内置的Flask功能可以在处理特定的请求时暂停其他请求?如果该方法未运行,则可以同时运行其他方法。
  • 也许我需要使用一些线程锁?我回顾了Python的线程库提供的锁定,并且找不到提供两种锁定的锁定:用于写入和读取。我自己需要实现这样的事情吗?

1 个答案:

答案 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"是单向的),否则你将传递一个引用实际的字典,你将回到线程不安全。