用Flask公开非线程安全的python类

时间:2018-12-18 20:21:11

标签: python multithreading rest flask thread-safety

我正在尝试编写一个简单的Flask应用程序,该应用程序仅公开OpenVPN包装器的方法。

该模块启动一个OpenVPN实例并与管理界面对话。它为Client类提供了所有有趣的方法,例如:

class Client(object):
    def start(self):
      self.start_instance()
    def status(self):
      res = self.management.send("status")
      return self.parse_status_msg(res)
    def statistics(self):
      res = self.management.send("statistics")
      return self.parse_statistics_msg(res)
    ...

管理send方法将命令发送到OpenVPN套接字,然后等待响应,然后将其返回。 我虽然公开了这样的内容:

app = flask.Flask(__name__)
client = OpenVPN.Client()

@app.route('/status', methods=["GET"])
def status():
    return client.status()
...

if __name__ == '__main__':
    app.run()

,并且如果我一次只有一个请求,则此方法有效。但是,一旦有多个并行请求,就会中断。 管理界面一次只能处理一个请求,因此,只能同时调用Client实例上的一个方法。 而且,如果我了解了Flask文档,一旦要在生产环境中推送某些内容,就会拥有flask应用程序的多个实例,这意味着拥有客户端全局变量也不正确。 (因为我只需要一个OpenVPN实例)

所以我的问题是,如何使它在多线程环境中工作?最佳做法是什么?我看错了这个角度吗?

在我看来,理想的行为是当有多个请求通过时,第一个请求被执行,另一个请求等待。第一个请求完成后,将以较低的过期时间(例如1秒)进行缓存,因此,另一个正在等待返回的请求将返回该请求。这可行吗?这是好/不好的做法吗?

感谢任何指针

0 个答案:

没有答案