我可以使用Flask app.run()作为独立服务多个客户端吗?

ATO*_*TOA 182 python flask

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

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

Sea*_*ira 267

flask.Flask.run接受**options其转发的其他关键字参数()werkzeug.serving.run_simple- 其中两个参数threaded(可以设置为processes启用线程)和threaded(可以将其设置为大于1的数字以使werkzeug生成多个进程来处理请求) .所以,如果你这样做:

if __name__ == '__main__':
    app.run(threaded=True)
Run Code Online (Sandbox Code Playgroud)

Flask将告诉Werkzeug使用线程并生成三个进程来处理传入的请求.

话虽如此,Werkzeug True包装了标准库的threaded=True包 - 该包包含WSGI的参考实现,而不是生产就绪的Web服务器.如果你打算在生产中使用Flask(假设"生产"不是一个不超过10个并发用户的低流量内部应用程序),请确保在真正的Web服务器后面站起来(参见Flask的文档部分)某些建议方法的部署选项).

  • *Chuckles* - @ATOzTOA - 不,这可能会非常适合生产(流程相对昂贵,除非你在每个请求中做了很多工作,否则没有理由不应该有4个或8个进程足够).也就是说,如果您只显示静态内容,那么最好使用经过优化的服务器(Apache,ngnix,IIS). (4认同)
  • @ATOzTOA - 如果你无法启动一个更好的服务器,那么我只是给它一个旋转,看看会发生什么.如果它在负载下表现不佳,您可以将其部署在不同的Web服务器之后. (3认同)
  • 如果我最多只能容纳100个用户怎么办?我可以只分配`processes = 100`并满意吗?就我而言,我只需要静态文件,不需要HTTP Post方法。我的要求是,我想将所有Flask线程作为父应用程序的一部分运行,以便它们都可以共享变量。 (2认同)
  • 同样,您通常不需要跨请求共享变量-如果您执行*操作*,则要么需要将自己限制为一个进程,要么使用某些带外通信(Redis,数据库,文件系统等)。 ),以便您的每个流程保持同步。 (2认同)
  • @ATOzTOA,关于您为什么不能同时指定“线程化”和“进程”的问题,请参见以下代码:http://werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving/ (2认同)

Rya*_*ona 60

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

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

也就是说,你仍然有一些不错的选择.Gunicorn是一个坚固,易于使用的WSGI服务器,它可以让你产生多个工作者(单独的进程,因此没有GIL担心),甚至还带有异步工作程序,可以加速你的应用程序(并使其更安全)没有你的工作(特别是与Flask).

尽管如此,即使是Gunicorn也不应该直接公开曝光.在生产中,它应该在更强大的HTTP服务器后面使用; nginx与Gunicorn和Flask相处得很好.

  • 从Flask 1.0开始,默认情况下启用线程模式. (18认同)
  • 不完全的.Gunicorn是python,nginx不是.但是,这不是你如何使用它们.Gunicorn会让你运行你的应用程序作为`gunicorn app:app 127.0.0.1:8080`而不是`python app.py`.Nginx将充当公共服务,暴露您的私人Gunicorn运行的应用程序[(反向代理)](http://en.wikipedia.org/wiki/Reverse_proxy),隐藏各种较低级别的HTTP实现细节,也许直接提供静态文件等 (13认同)

Gre*_* Li 12

来自 2020 年的提示:

从 Flask 1.0 开始,它默认启用多线程(source),你不需要做任何事情,只需升级它:

$ pip install -U flask
Run Code Online (Sandbox Code Playgroud)

如果您使用flask run而不是app.run()旧版本,则可以使用命令选项 ( --with-threads/--without-threads)控制线程行为:

$ flask run --with-threads
Run Code Online (Sandbox Code Playgroud)

它与 app.run(threaded=True)