一个Flask进程接收多less个并发请求?
我正在用Flask构build一个应用程序,但是我对WSGI不太了解,而且它是HTTP基础,Werkzeug。 当我开始使用gunicorn和4个工作进程来提供Flask应用程序时,这是否意味着我可以处理4个并发请求?
我的意思是并发请求,而不是每秒或其他任何请求。
谢谢!
当运行开发服务器时,你运行app.run()
,你会得到一个单一的同步过程,这意味着一次最多处理一个请求。
通过在其默认configuration中将Gunicorn粘贴在它之前,并简单地增加--workers
数量,您获得的基本上是一些进程(由app.run()
pipe理),每个进程都像app.run()
开发服务器一样。 4名工作人员== 4个并发请求。 这是因为Gunicorn默认使用其包含的sync
工作者types。
需要注意的是, eventlet
还包括asynchronous工作者,即eventlet
和gevent
(也是tornado
,但是最好与Tornado框架一起使用)。 通过使用--worker-class
标志指定这些asynchronous工作人员之一,您将得到的是Gunicornpipe理大量asynchronous进程, 每个asynchronous进程pipe理自己的并发。 这些进程不使用线程,而是使用协程。 基本上,在每个进程中,一次只能发生一件事(1个线程),但是当等待外部进程完成时(考虑数据库查询或等待networkingI / O),对象可以被“暂停”。
这意味着,如果您使用的是Gunicorn的asynchronous工作人员,则每个工作人员一次只能处理多个请求。 究竟有多less人是最好的,取决于你的应用程序的性质,环境,运行的硬件等等。更多细节可以在Gunicorn的devise页面find,并注意gevent如何在其介绍页面上工作。
Flask将同时处理每个线程的一个请求。 如果你有2个进程,每个进程有4个线程,那就是8个并发请求。
Flask不产生或pipe理线程或进程。 这是WSGI网关(例如gunicorn)的责任。
不,你绝对可以处理更多的事情。
重要的是要深刻记住,假设你正在运行一台核心机器,CPU一次只运行一个指令*。
也就是说,CPU只能执行非常有限的一组指令,并且每个时钟周期不能执行多个指令(许多指令甚至需要多于一个时钟周期)。
因此,我们在计算机科学中所谈论的大多数并发性是软件并发性。 换句话说,有一层软件实现从我们这里抽象出底层的CPU,使我们认为我们正在同时运行代码。
这些“事物”可以是进程,它们是并发运行的代码单元,每个进程都认为它在自己的世界中运行,拥有自己的非共享内存。
另一个例子是线程,线程是进程内的代码单元,允许并发。
你的4个工作进程能够处理4个以上的请求的原因是他们会启动线程来处理越来越多的请求。
实际的请求限制取决于所select的HTTP服务器,I / O,操作系统,硬件,networking连接等。
祝你好运!
*指令是CPU可以运行的基本命令。 例子 – 添加两个数字,从一条指令跳转到另一条指令