我知道我可以将 Flask 与 Apache 或其他 Web 服务器链接起来。但是,我正在考虑将 Flask 作为同时为多个客户端提供服务的独立服务器运行。
这可能吗?我是否必须处理生成多个线程并管理它们?
flask.Flask.run
**options
接受它转发到的附加关键字参数 ( ) werkzeug.serving.run_simple
- 其中两个参数是threaded
(一个布尔值) 和processes
(您可以将其设置为大于一的数字以使 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 或更高版本,则使用线程处理多个客户端。
话虽如此,Werkzeugserving.run_simple
包装了标准库的wsgiref
包——该包包含 WSGI 的参考实现,而不是生产就绪的 Web 服务器。如果你打算在生产环境中使用 Flask(假设“生产环境”不是一个不超过 10 个并发用户的低流量内部应用程序),请确保将它放在一个真正的 Web 服务器后面(参见 Flask 文档中标题为一些建议方法的部署选项)。
在 Flask 中使用 simpleapp.run()
在单个线程上创建单个同步服务器,一次只能为一个客户端提供服务。正是出于这个原因,它旨在用于低需求的受控环境(即开发、调试)。
由于Python GIL,产生线程并自己管理它们可能不会让你走得太远。
也就是说,您仍然有一些不错的选择。Gunicorn是一个可靠的、易于使用的 WSGI 服务器,它可以让您生成多个工作程序(独立的进程,因此无需担心 GIL),甚至还带有异步工作程序,可以加快您的应用程序(并使其更安全)对您没有任何工作(尤其是使用 Flask)。
尽管如此,即使是 Gunicorn 也不应该直接公开曝光。在生产中,应该在更健壮的 HTTP 服务器后面使用它;nginx往往与 Gunicorn 和 Flask 配合得很好。
2020 年的提示:
从 Flask 1.0 开始,它默认启用多线程(source),你不需要做任何事情,只需升级它:
$ pip install -U flask
如果您使用的是旧版本flask run
而不是app.run()
旧版本,则可以使用命令选项 ( ) 控制线程行为--with-threads/--without-threads
:
$ flask run --with-threads
这和app.run(threaded=True)