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


201

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

这可能吗?我是否需要处理产生多个线程并进行管理?

Answers:


295

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


2
如果我最多只能容纳100个用户怎么办?我可以分配processes=100并满意吗?就我而言,我只需要静态文件,不需要HTTP Post方法。我的要求是,我想将所有Flask线程作为父应用程序的一部分运行,以便它们都可以共享变量。
ATOzTOA

4
轻笑 - @ATOzTOA -不,那很可能是相当适得其反(进程是比较昂贵的,除非你是做了很多工作,在每个请求没有理由4点或8的过程不应该是足够了)。就是说,如果只显示静态内容,则最好使用经过优化的服务器(Apache,ngnix,IIS)。
肖恩·维埃拉

2
同样,您通常不需要跨请求共享变量-如果这样做,您要么需要将自己限制在一个进程中,要么使用某些带外通信(Redis,数据库,文件系统等),因此您的每个进程都保持同步。
肖恩·维埃拉

3
@ATOzTOA-如果您无法启动更好的服务器,那么我只是旋转一下,看看会发生什么。如果它在负载下表现不佳,则可以将其部署在其他Web服务器后面。
肖恩·维埃拉

2
@ATOzTOA,关于您为什么不能同时指定“线程”和“进程”的问题,请参见以下代码:werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

62

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

由于Python GIL,因此自行生成线程并自行管理它们也不会使您走得太远。

也就是说,您仍然有一些不错的选择。Gunicorn是一个坚固且易于使用的WSGI服务器,它使您可以产生多个工作程序(独立的进程,因此无需担心GIL),甚至还带有异步工作程序,这些工作程序可以在不增加成本的情况下加快您的应用程序(并使其更安全)。无需您做任何事情(尤其是使用Flask)。

不过,即使Gunicorn也可能不应该直接公开曝光。在生产中,应在功能更强大的HTTP服务器之后使用它。Nginx倾向于与Gunicorn和Flask搭配使用。


17
不完全的。Gunicorn是python,nginx不是。但是,这不是您将如何使用它们。Gunicorn会让您以gunicorn app:app 127.0.0.1:8080而不是的身份运行您的应用python app.py。Nginx的将作为暴露你的私人Gunicorn运行的应用程序的公共服务(反向代理),隐藏的较低级别的HTTP实现细节种种,或许直接提供静态文件等
瑞安Artecona

带有app.run(threaded = True)的烧瓶在Apache2上使用mod_wsgi flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.