如何用 Flask 处理多个 HTTP 请求
How to process several HTTP requests with Flask
我对 Flask、Waitress 和 HTTP 请求的并行处理有疑问。
I have read that Flask alone 一次只能处理一个 HTTP 请求。
在下面的 table 中,我提供了所有可能的配置,我希望得到您关于我可以并行处理的 HTTP 请求数量的反馈。
| |Only Flask| Flask and Waitress|
|------------------- -- |----------|-------------------|
|1 CPU & 1 core | 1 request| 1 request |
|1 CPU & 4 core | 1 request| 4 request |
|2 CPU & 1 core each CPU | 1 request| 2 request |
|2 CPU & 4 core each CPU | 1request | 8 requests |
我问这些问题是因为一位同事告诉我,我们可以处理 数千个 HTTP 请求,而 Apach 服务器只有 1 个 CPU 和 1 个核心 !!
那么,应该如何处理最大并行HTTP请求数呢?
小编为你解惑
当您在本地开发时使用 Flask 时,您使用的是单线程的内置服务器。这意味着它一次只会处理一个请求。这就是为什么您不应该在生产环境中简单地使用 FLASK_ENV=production
和 运行 的原因之一。内置服务器无法在这些环境中 运行。将 FLASK_ENV
更改为生产环境并 运行,您会在终端中看到一条警告。
现在,开始介绍如何在生产环境中 运行 Flask、CPU、核心、线程和其他东西
为了运行生产环境中的Flask,你需要有一个合适的应用服务器来运行你的Flask应用。这里有 Gunicorn,它与 Flask 兼容,也是 运行ning Flask 最受追捧的方式之一。
在 gunicorn 中,您可以通过不同的方式根据服务器的规格配置最佳方式 运行。
您可以通过以下方式实现:
- 工人 Class - 要使用的工人类型
- 工人数量
- 线程数量
您计算最大并发数的方法如下:
以4核服务器为
根据 gunicorn 的文档,最佳 number of workers
建议为 (2 * num_of_cores) + 1
,在这种情况下变为 (2*4)+1 = 9
现在,number of threads 的最佳配置是 2 to 4 x $(num_of_cores)
,在本例中为 4*9 = 36
所以现在,你有 9 个 Worker,每个 36 个线程。每个线程一次可以处理一个请求,所以你可以有 9*36=324 个并发连接
同样,你可以计算Waitress。我更喜欢使用 Gunicorn,因此您需要查看 waitress 的文档以了解配置。
Web 服务器即将推出
到目前为止,您配置的是 运行 Flask 的应用程序服务器。这可行,但您不应该将应用程序服务器直接暴露给 Internet。相反,总是建议将 Flask 部署在像 Nginx 这样的反向代理后面。 Nginx 充当一个成熟的 Web 服务器,能够处理现实世界的工作负载。
所以总的来说,您可以根据您的要求使用下面列表中的组合,
Flask + 应用服务器 + Web 服务器 其中,
应用程序服务器是 Gunicorn、uWSGI、Gevent、Twisted Web、Waitress 等之一,以及来自 Nginx、Apache、Traefik、Caddy 等之一的 Web 服务器
我对 Flask、Waitress 和 HTTP 请求的并行处理有疑问。
I have read that Flask alone 一次只能处理一个 HTTP 请求。
在下面的 table 中,我提供了所有可能的配置,我希望得到您关于我可以并行处理的 HTTP 请求数量的反馈。
| |Only Flask| Flask and Waitress|
|------------------- -- |----------|-------------------|
|1 CPU & 1 core | 1 request| 1 request |
|1 CPU & 4 core | 1 request| 4 request |
|2 CPU & 1 core each CPU | 1 request| 2 request |
|2 CPU & 4 core each CPU | 1request | 8 requests |
我问这些问题是因为一位同事告诉我,我们可以处理 数千个 HTTP 请求,而 Apach 服务器只有 1 个 CPU 和 1 个核心 !!
那么,应该如何处理最大并行HTTP请求数呢?
小编为你解惑
当您在本地开发时使用 Flask 时,您使用的是单线程的内置服务器。这意味着它一次只会处理一个请求。这就是为什么您不应该在生产环境中简单地使用 FLASK_ENV=production
和 运行 的原因之一。内置服务器无法在这些环境中 运行。将 FLASK_ENV
更改为生产环境并 运行,您会在终端中看到一条警告。
现在,开始介绍如何在生产环境中 运行 Flask、CPU、核心、线程和其他东西
为了运行生产环境中的Flask,你需要有一个合适的应用服务器来运行你的Flask应用。这里有 Gunicorn,它与 Flask 兼容,也是 运行ning Flask 最受追捧的方式之一。
在 gunicorn 中,您可以通过不同的方式根据服务器的规格配置最佳方式 运行。 您可以通过以下方式实现:
- 工人 Class - 要使用的工人类型
- 工人数量
- 线程数量
您计算最大并发数的方法如下: 以4核服务器为
根据 gunicorn 的文档,最佳 number of workers
建议为 (2 * num_of_cores) + 1
,在这种情况下变为 (2*4)+1 = 9
现在,number of threads 的最佳配置是 2 to 4 x $(num_of_cores)
,在本例中为 4*9 = 36
所以现在,你有 9 个 Worker,每个 36 个线程。每个线程一次可以处理一个请求,所以你可以有 9*36=324 个并发连接
同样,你可以计算Waitress。我更喜欢使用 Gunicorn,因此您需要查看 waitress 的文档以了解配置。
Web 服务器即将推出
到目前为止,您配置的是 运行 Flask 的应用程序服务器。这可行,但您不应该将应用程序服务器直接暴露给 Internet。相反,总是建议将 Flask 部署在像 Nginx 这样的反向代理后面。 Nginx 充当一个成熟的 Web 服务器,能够处理现实世界的工作负载。
所以总的来说,您可以根据您的要求使用下面列表中的组合,
Flask + 应用服务器 + Web 服务器 其中, 应用程序服务器是 Gunicorn、uWSGI、Gevent、Twisted Web、Waitress 等之一,以及来自 Nginx、Apache、Traefik、Caddy 等之一的 Web 服务器