单个Flask进程接收多少个并发请求?

时间:2012-06-07 19:12:20

标签: python flask wsgi gunicorn

我正在使用Flask构建一个应用程序,但我不太了解WSGI,它是HTTP基础,Werkzeug。当我开始使用gunicorn和4个工作进程为Flask应用程序提供服务时,这是否意味着我可以处理4个并发请求?

我的意思是并发请求,而不是每秒或其他任何请求。

谢谢!

4 个答案:

答案 0 :(得分:135)

运行开发服务器时,运行app.run(),您将获得一个同步过程,这意味着一次最多可处理1个请求。

通过在其默认配置中坚持使用Gunicorn并简单地增加--workers的数量,你得到的实际上是许多进程(由Gunicorn管理),每个进程都像app.run()开发服务器。 4名工人== 4个并发请求。这是因为Gunicorn默认使用其包含的sync工作者类型。

值得注意的是,Gunicorn还包括异步工作者,即eventletgevent(以及tornado,但最好与Tornado框架一起使用,似乎)。通过使用--worker-class标志指定其中一个异步工作程序,您获得的是Gunicorn管理许多异步进程,每个管理自己的并发。这些进程不使用线程,而是使用协同程序。基本上,在每个进程中,一次只能发生一件事(1个线程),但是当对象等待外部进程完成时(想想数据库查询或等待网络I / O),对象可以被“暂停”。

这意味着,如果您使用的是Gunicorn的异步工作者之一,那么每个工作人员一次只能处理多个请求。最好的工作人员数量取决于应用程序的性质,环境,运行的硬件等。更多详细信息可以在Gunicorn's design页面和notes on how gevent works的介绍页面上找到。

答案 1 :(得分:25)

Flask将同时处理每个线程的一个请求。如果你有2个进程,每个进程有4个线程,那就是8个并发请求。

Flask不会产生或管理线程或进程。这是WSGI网关的责任(例如,gunicorn)。

答案 2 :(得分:14)

目前,有一个远比原来提供的解决方案更简单的解决方案。运行应用程序时,您只需将threaded=True参数传递给app.run()来电,例如:

app.run(host="your.host", port=4321, threaded=True)

我们在werkzeug docs中可以看到的另一个选项是使用procesess参数,该参数接收一个数字> 1表示要处理的最大并发进程数:

  
      
  • threaded - 进程是否应该在单独的线程中处理每个请求?
  •   
  • 进程 - 如果大于1,则在新进程中处理每个请求,直到此最大并发进程数。
  •   

类似的东西:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

有关run()方法here的更多信息,以及导致我找到解决方案和api引用的blog post

答案 3 :(得分:7)

不 - 你绝对可以处理更多。

重要的是要记住,在内心深处,假设您正在运行单核心机器,CPU实际上一次只运行一条指令*。

即,CPU只能执行一组非常有限的指令,并且每个时钟周期不能执行多条指令(许多指令甚至超过1个滴答)。

因此,我们在计算机科学中谈论的大多数并发性是软件并发性。 换句话说,有一些软件实现层可以从我们这里抽象出底层CPU,并让我们认为我们正在同时运行代码。

这些“事物”可以是进程,它们是并发运行的代码单元,因为每个进程都认为它在自己的世界中运行,拥有自己的非共享内存。

另一个例子是线程,它是进程内部允许并发的代码单元。

您的4个工作进程能够处理4个以上请求的原因是它们将触发线程来处理越来越多的请求。

实际的请求限制取决于所选的HTTP服务器,I / O,操作系统,硬件,网络连接等。

祝你好运!

*指令是CPU可以运行的基本命令。示例 - 添加两个数字,从一条指令跳转到另一条指令