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

时间:2013-02-11 14:34:13

标签: python flask

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

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

3 个答案:

答案 0 :(得分:246)

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

if __name__ == '__main__':
    app.run(threaded=True)
    # Alternately
    # app.run(processes=3)

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

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

答案 1 :(得分:55)

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

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

那说,你还有一些不错的选择。 Gunicorn是一个可靠,易于使用的WSGI服务器,它可以让你产生多个工作程序(单独的进程,因此没有GIL担心),甚至还带有asynchronous workers来加速你的应用程序(和让你更安全)你几乎没有工作(尤其是Flask)。

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

答案 2 :(得分:2)

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)