如何使用Flask处理多个HTTP请求



我有一个关于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个核心的Apach服务器处理数千个HTTP请求

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

让我为您消除困惑。

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

现在,来谈谈如何在生产环境中运行Flask,CPU,Core,Threads和其他东西

要在生产环境中运行Flask,您需要有一个合适的应用程序服务器来运行您的Flask应用程序。这里有Gunicorn,它与Flask兼容,是运行Flask最受欢迎的方式之一。

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

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

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

根据gunicorn的文献,最佳number of workers被建议为(2 * num_of_cores) + 1,在这种情况下,它变为(2*4(+1=9

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

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

同样,您也可以对"女服务员"进行计算。我更喜欢使用Gunicorn,所以你需要查看女服务员的文档以了解配置。

现在使用Web服务器

到目前为止,您所配置的是一个运行Flask的应用程序服务器。这是可行的,但不应该将应用程序服务器直接暴露在互联网上。相反,人们总是建议在像Nginx这样的反向代理后面部署Flask。Nginx是一个成熟的web服务器,能够处理真实世界的工作负载。

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

烧瓶+应用程序服务器+Web服务器其中,应用服务器是Gunicorn、uWSGI、Gevent、Twisted Web、Waitress等之一,也是Nginx、Apache、Traefik、Caddy等之一的Web服务器

最新更新