如果您已经在使用多个线程,epoll
则不会为您提供太多额外的好处。
关键epoll
是单个线程可以同时侦听多个文件选择器上的活动(并在每个事件发生时对其进行响应),从而提供事件驱动的多任务处理,而无需产生额外的线程。线程相对便宜(与生成进程相比),但每个线程都需要一些开销(毕竟,它们每个都必须维护一个调用堆栈)。
如果您愿意,您可以使用 将您的池进程重写为单线程epoll
,这将减少您的整体线程使用计数,但当然您必须考虑这是否是您关心的事情 - 通常,对于低每个工作人员同时请求的数量,产生线程的开销无关紧要,但是如果您希望每个工作人员能够处理 1000 个打开的连接,那么开销可能会变得很大(这就是epoll
亮点)。
但...
您所描述的内容听起来很可疑,就像您基本上是在重新发明轮子一样-您的:
- 主循环和请求解释器
- 进程池
听起来几乎完全一样:
nginx
(或任何其他负载均衡器/反向代理)
- 预分叉
tornado
应用程序
Tornado 是一个使用 的单线程 Web 服务器 python 模块epoll
,它具有内置的预分叉功能(这意味着它将自身生成多个副本作为单独的进程,有效地创建进程池)。Tornado 基于为 Friendfeed 提供动力而创建的技术——他们需要一种方法来处理大量打开的连接,以供长期轮询的客户寻找新的实时更新。
如果您将此作为一个学习过程,那么一定要重新发明!这是一个很好的学习方式。但是如果你真的想在这些东西之上构建一个应用程序,我强烈建议你考虑使用现有的、稳定的、共同开发的项目——它会为你节省很多时间、错误的开始和潜在的陷阱。
(PS我同意你的头像。<3)