238

我知道我可以将 Flask 与 Apache 或其他 Web 服务器链接起来。但是,我正在考虑将 Flask 作为同时为多个客户端提供服务的独立服务器运行。

这可能吗?我是否必须处理生成多个线程并管理它们?

4

3 回答 3

341

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 文档中标题为一些建议方法的部署选项)。

于 2013-02-12T01:20:58.797 回答
69

在 Flask 中使用 simpleapp.run()在单个线程上创建单个同步服务器,一次只能为一个客户端提供服务。正是出于这个原因,它旨在用于低需求的受控环境(即开发、调试)。

由于Python GIL,产生线程并自己管理它们可能不会让你走得太远。

也就是说,您仍然有一些不错的选择。Gunicorn是一个可靠的、易于使用的 WSGI 服务器,它可以让您生成多个工作程序(独立的进程,因此无需担心 GIL),甚至还带有异步工作程序,可以加快您的应用程序(并使其更安全)对您没有任何工作(尤其是使用 Flask)。

尽管如此,即使是 Gunicorn 也不应该直接公开曝光。在生产中,应该在更健壮的 HTTP 服务器后面使用它;nginx往往与 Gunicorn 和 Flask 配合得很好。

于 2013-02-11T16:03:07.757 回答
15

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)

于 2020-09-16T00:21:13.770 回答