女服务员如何处理并发任务?

2024-03-28 17:06:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Django和Waitress构建python Web服务器,但我想知道Waitress如何处理并发请求,以及何时可能发生阻塞


虽然Waitress documentation提到有多个工作线程可用,但它没有提供很多关于如何实现它们以及python GIL如何影响它们的信息(我自己强调):

When a channel determines the client has sent at least one full valid HTTP request, it schedules a "task" with a "thread dispatcher". The thread dispatcher maintains a fixed pool of worker threads available to do client work (by default, 4 threads). If a worker thread is available when a task is scheduled, the worker thread runs the task. The task has access to the channel, and can write back to the channel's output buffer. When all worker threads are in use, scheduled tasks will wait in a queue for a worker thread to become available.

关于Stackoverflow的信息似乎也不多。从问题"Is Gunicorn's gthread async worker analogous to Waitress?"开始:

Waitress has a master async thread that buffers requests, and enqueues each request to one of its sync worker threads when the request I/O is finished.


这些声明并没有涉及GIL(至少从我的理解来看),如果有人能详细阐述一下工作线程是如何为女服务员工作的,那就太好了。谢谢


Tags: theto信息taskisrequestchannel线程
1条回答
网友
1楼 · 发布于 2024-03-28 17:06:14

以下是事件驱动异步服务器通常的工作方式:

  • 启动一个进程并侦听传入的请求。利用操作系统的事件通知API,可以很容易地从单个线程/进程为数千个客户端提供服务
  • 由于只有一个进程管理所有连接,因此您不希望在此进程中执行任何缓慢(或阻塞)任务。因为这样它会阻止每个客户端的程序
  • 要执行阻塞任务,服务器将任务委托给“工作人员”。辅助进程可以是线程(在同一进程中运行)或单独的进程(或子进程)。现在,当工作人员执行阻塞任务时,主进程可以继续为客户机提供服务

How does Waitress handle concurrent tasks?

和我刚才描述的差不多。对于工人来说,它创建线程,而不是进程

how the python GIL affects them

女服务员给工人用线。所以,是的,他们受到GIL的影响,因为他们并不是真正并发的,尽管他们看起来是并发的。“异步”是正确的术语

Python中的线程在单个进程内、单个CPU核上运行,而不是并行运行。一个线程在很短的时间内获取GIL并执行其代码,然后GIL被另一个线程获取

但由于GIL是在网络I/O上发布的,因此每当出现网络事件(如传入请求)时,父进程将始终获取GIL,这样您就可以确保GIL不会影响网络绑定操作(如接收请求或发送响应)

另一方面,Python进程实际上是并发的:它们可以在多个核心上并行运行。但服务员不使用流程

你应该担心吗?

如果您只是在执行诸如数据库读/写之类的小型阻塞任务,并且每秒只为几百个用户提供服务,那么使用线程并不是那么糟糕

为了服务大量用户或执行长时间运行的阻塞任务,可以考虑使用外部任务队列,如Celery。这将比自己生成和管理流程要好得多

相关问题 更多 >