1

我有一个关于 Flask、Waitress 和 HTTP 请求的并行处理的问题。

我读过 Flask一次只能处理一个 HTTP 请求。

在下表中,我列出了所有可能的配置,我希望得到您关于我可以并行处理的 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        |  

我问这些问题是因为一位同事告诉我,我们可以使用只有 1 个 CPU 和 1 个内核的 Apache 服务器处理数千个 HTTP 请求!

那么,我应该如何并行处理最大数量的 HTTP 请求呢?

4

1 回答 1

2

让我为你解开困惑。

当您在本地开发时使用 Flask 时,您使用的是单线程的内置服务器。这意味着它一次只会处理一个请求。这就是为什么您不应该简单地拥有FLASK_ENV=production并在生产环境中运行的原因之一。内置服务器无法在这些环境中运行。如果您更改FLASK_ENV为生产并运行,您会在终端中找到警告。

现在,开始讨论如何在生产环境中运行 Flask、CPU、Core、线程和其他东西

要在生产环境中运行 Flask,您需要有一个合适的应用服务器来运行您的 Flask 应用程序。Gunicorn出现了,它与 Flask 兼容,也是最受追捧的 Flask 运行方式之一。

在 gunicorn 中,您有不同的方法来配置基于服务器规格的最佳运行方式。您可以通过以下方式实现它:

  1. Worker Class - 要使用的工人类型
  2. 工人数
  3. 线程数

计算最大并发请求数的方法如下: 以4核服务器为

根据gunicornnumber of workers的文档,建议最佳值(2 * num_of_cores) + 1在这种情况下变为 (2*4)+1 = 9

现在,线程数的最佳配置2 to 4 x $(num_of_cores)在这种情况下是 4*9 = 36

所以现在,你有 9 个工人,每个工人有 36 个线程。每个线程一次可以处理一个请求,因此您可以拥有 9*36=324 个并发连接

同样,您可以计算 Waitress。我更喜欢使用 Gunicorn,因此您需要查看waitress的文档以了解配置。

现在来到 Web 服务器

到目前为止,您已经配置了一个运行 Flask 的应用程序服务器。这可行,但您不应将应用程序服务器直接暴露给 Internet。相反,总是建议将 Flask 部署在像 Nginx 这样的反向代理之后。Nginx 充当一个成熟的 Web 服务器,能够处理现实世界的工作负载。

因此,总而言之,您可以根据自己的要求使用下表中的组合,

Flask + Application Server + Web Server其中,Application Server 是 Gunicorn、uWSGI、Gevent、Twisted Web、Waitress 等之一,以及来自 Nginx、Apache、Traefik、Caddy 等之一的 Web Server

于 2020-02-22T16:50:47.683 回答