服务生如何处理并发任务?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务生如何处理并发任务?相关的知识,希望对你有一定的参考价值。
[我正在尝试使用Django和Waitress构建python网络服务器,但我想知道Waitress如何处理并发请求,以及何时发生[[blocking。
虽然Waitress documentation提到有多个工作线程可用,但是它没有提供很多有关如何实现它们以及python GIL如何影响它们的信息(强调我自己:)
[当通道确定客户端已发送至少一个完整的有效HTTP请求时,它将与“线程分派器”一起调度“任务”。线程分派器(默认为4个线程)。如果在计划任务时工作线程可用,则工作线程将运行任务。任务有权访问通道,并且可以写回通道的输出缓冲区。当所有工作线程都在使用中时,计划任务将在队列中等待以使工作线程可用。似乎在Stackoverflow上也没有太多信息。从问题"Is Gunicorn's gthread async worker analogous to Waitress?":维护可用于执行客户端工作的固定工作线程池
女服务员有一个主异步线程来缓冲请求,并在请求I / O完成时将每个请求排队到其同步工作线程之一。
这些语句没有解决GIL(至少从我的理解来看),如果有人可以详细说明工作者线程如何为Waitress工作,那就太好了。谢谢!
答案
以下是事件驱动的异步服务器通常如何工作:- 启动一个进程并监听传入的请求。利用操作系统的事件通知API,可以非常轻松地从单个线程/进程为数千个客户端提供服务。
- 由于只有一个进程管理所有连接,因此您不想在此进程中执行任何慢速(或阻塞)任务。因为那样,它将阻止每个客户端的程序。
- 为了执行阻止任务,服务器将任务委托给“工人”。工作程序可以是线程(在同一进程中运行)或独立的进程(或子进程)。现在,当工作人员执行阻止任务时,主要流程可以继续为客户提供服务。
几乎与我上面描述的相同。对于工作者,它创建线程,而不是进程。服务生如何处理并发任务?
女服务员为工人使用线程。因此,是的,它们受到了GIL的影响,因为它们似乎并没有真正并发。 “异步”是正确的术语。python GIL如何影响他们
Python中的线程在单个CPU内核上的单个进程内运行,并且不能并行运行。线程在非常短的时间内获取GIL并执行其代码,然后另一个线程获取GIL。
但是由于GIL是在网络I / O上发布的,所以只要发生网络事件(例如传入请求),父进程始终会获取GIL,这样您就可以确保GIL不会影响网络绑定操作(例如接收请求或发送响应)。
另一方面,Python进程实际上是并发的:它们可以在多个内核上并行运行。但是,女服务员不使用流程。
您担心吗?
如果您只是在执行诸如数据库读/写之类的小型阻塞任务,并且每秒仅服务数百个用户,那么使用线程并不是那么糟糕。为了为大量用户提供服务或执行长时间运行的阻止任务,您可以考虑使用外部任务队列,例如Celery。这将比自己生成和管理流程要好得多。
以上是关于服务生如何处理并发任务?的主要内容,如果未能解决你的问题,请参考以下文章
Android 中的两个并发 AsyncTasks - 如何处理竞争条件?
mongodb 连接如何处理 NodeJS express 服务器中的并发请求?