我正在使用Flask构建一个应用程序,但我不太了解WSGI,它是HTTP基础,Werkzeug。当我开始使用gunicorn和4个工作进程为Flask应用程序提供服务时,这是否意味着我可以处理4个并发请求?
我的意思是并发请求,而不是每秒或其他任何请求。
谢谢!
答案 0 :(得分:135)
运行开发服务器时,运行app.run()
,您将获得一个同步过程,这意味着一次最多可处理1个请求。
通过在其默认配置中坚持使用Gunicorn并简单地增加--workers
的数量,你得到的实际上是许多进程(由Gunicorn管理),每个进程都像app.run()
开发服务器。 4名工人== 4个并发请求。这是因为Gunicorn默认使用其包含的sync
工作者类型。
值得注意的是,Gunicorn还包括异步工作者,即eventlet
和gevent
(以及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
答案 3 :(得分:7)
不 - 你绝对可以处理更多。
重要的是要记住,在内心深处,假设您正在运行单核心机器,CPU实际上一次只运行一条指令*。
即,CPU只能执行一组非常有限的指令,并且每个时钟周期不能执行多条指令(许多指令甚至超过1个滴答)。
因此,我们在计算机科学中谈论的大多数并发性是软件并发性。 换句话说,有一些软件实现层可以从我们这里抽象出底层CPU,并让我们认为我们正在同时运行代码。
这些“事物”可以是进程,它们是并发运行的代码单元,因为每个进程都认为它在自己的世界中运行,拥有自己的非共享内存。
另一个例子是线程,它是进程内部允许并发的代码单元。
您的4个工作进程能够处理4个以上请求的原因是它们将触发线程来处理越来越多的请求。
实际的请求限制取决于所选的HTTP服务器,I / O,操作系统,硬件,网络连接等。
祝你好运!*指令是CPU可以运行的基本命令。示例 - 添加两个数字,从一条指令跳转到另一条指令