问题:我可以单独使用Flask app.run()服务多个客户端吗?
我知道我可以将Flask与Apache或其他Web服务器链接。但是,我当时正在考虑将Flask作为独立的服务器运行,同时为多个客户端提供服务。
这可能吗?我是否需要处理产生多个线程并进行管理?
回答 0
flask.Flask.run
接受**options
转发给它的其他关键字参数()werkzeug.serving.run_simple
-其中两个参数是threaded
(布尔值)和processes
(您可以将其设置为大于1的数字以使werkzeug产生多个进程来处理请求)。
threaded
默认True
版本自Flask 1.0起,因此对于最新版本的Flask,默认情况下默认开发服务器将能够同时为多个客户端提供服务。对于较旧版本的Flask,您可以显式传递threaded=True
以启用此行为。
例如,您可以
if __name__ == '__main__':
app.run(threaded=True)
以与旧Flask版本兼容的方式使用线程处理多个客户端,或者
if __name__ == '__main__':
app.run(threaded=False, processes=3)
告诉Werkzeug生成三个进程来处理传入的请求,或者只是
if __name__ == '__main__':
app.run()
如果您知道将使用Flask 1.0或更高版本,则可以使用线程来处理多个客户端。
话虽如此,Werkzeug的serving.run_simple
包装了标准库的wsgiref
软件包-该软件包包含WSGI的参考实现,而不是可用于生产的Web服务器。如果您要在生产环境中使用Flask(假设“生产环境”不是低流量的内部应用程序,并发用户不超过10个),请确保将其支撑在真实的Web服务器后面(请参阅Flask文档标题为“ 一些建议方法的部署选项)。
回答 1
app.run()
在Flask中使用simple from在单个线程上创建单个同步服务器,该服务器一次只能服务一个客户端。正是出于这个原因,它旨在用于需求较低的受控环境(即开发,调试)中。
由于Python GIL,因此自行生成线程并自行管理它们也不会使您走得太远。
也就是说,您仍然有一些不错的选择。Gunicorn是一个坚固且易于使用的WSGI服务器,它使您可以产生多个工作程序(独立的进程,因此无需担心GIL),甚至还带有异步工作程序,这些工作程序可以在不增加成本的情况下加快您的应用程序(并使其更安全)。无需您做任何事情(尤其是使用Flask)。
不过,即使Gunicorn也可能不应该直接公开曝光。在生产中,应在功能更强大的HTTP服务器之后使用它。Nginx倾向于与Gunicorn和Flask搭配使用。