Python 基于教育目的的HTTP代理服务器设计
出于教育目的,我正在编写一个HTTP代理服务器。在这个服务器中,我想从使用多处理器内核中获益,因为有一些任务显然可以并行完成 我们有0-5个HTTP请求处理步骤,每个步骤对应1或2个IO操作。步骤描述非常简单,可以在图表上看到。并行的想法如下: 1“侦听”方法只需侦听s套接字和接受s传入连接 2“调度程序”方法: -等待选择功能以获取可用于进一步分配的FD -将可用的FD(连接)放入请求集中。也许最好将其称为TaskSet,因为任务出现在读取HTTP请求之前。每个任务至少有 [当前fd(每一步可能改变);步骤编号;] -安排每个步骤的处理(参见3),更改每个请求的当前步骤 -根据当前步骤打开/关闭fds,将fds分配给请求 3“处理”方法应用于每个请求,以执行每个步骤(发送数据) 我想将(1)和(2)分别放在一个单独的线程中,因为它们意味着阻塞“listen”和“select”。 将每个请求及其当前步骤(3)发送到一个单独的线程,该线程的数量不超过处理器或内核的数量(作为参数传递)。其动机是,每个套接字操作都在单独的缓冲区上执行,并且可以并行完成 两个问题: -这些都有意义吗?Python 基于教育目的的HTTP代理服务器设计,python,multithreading,sockets,Python,Multithreading,Sockets,出于教育目的,我正在编写一个HTTP代理服务器。在这个服务器中,我想从使用多处理器内核中获益,因为有一些任务显然可以并行完成 我们有0-5个HTTP请求处理步骤,每个步骤对应1或2个IO操作。步骤描述非常简单,可以在图表上看到。并行的想法如下: 1“侦听”方法只需侦听s套接字和接受s传入连接 2“调度程序”方法: -等待选择功能以获取可用于进一步分配的FD -将可用的FD(连接)放入请求集中。也许最好将其称为TaskSet,因为任务出现在读取HTTP请求之前。每个任务至少有 [当前fd(每一步
-如果我是用Python实现的,那么我应该使用不带GIL的Python实现(比如IronPython)。使用常规的CPython,我不会从同步记录/写入的少数内核中获益(同时在被阻止时仍能正确利用时间)?我建议将这些步骤用于教育项目
多处理
模块中,详细阅读。您可能希望创建一个工作池,其大小与cpu的数量成一定比例(请参见cpu\u count()
)多处理.Queue
和多处理.Manager
。您可能希望创建一个队列
,并将其传递给所有池工作者管理器
、队列
和池
之后,在单个进程中循环和接受
传入连接。将每个接受的连接推送到队列
。每个池工作线程都应该循环并从此队列
获取连接(这将在没有连接时阻止它们)。当工作程序发现这样的连接时,它应该进一步处理它注意页面中有一个很好的例子,搜索“一个工作进程池如何在共享一个侦听套接字时运行一个SimpleHTTPServer.HttpServer实例的示例”。我建议您仔细阅读一下,我需要a)有一些投资组合项目,b)练习多线程应用程序设计。执行常见且多次实施的任务对我的目标有好处a)易于向非开发人员的客户演示b)每个人都应该知道实现这一点的常用方法,因此很容易判断我的解决方案是否正确。我错了吗?我建议你以后明确说明这个问题是出于教育目的。谢谢你回复相关的API。您提出了按连接划分流的多进程方法(而不是按步骤划分的多线程方法)。为什么您更喜欢它呢?首先,这种方法使您回到主流Python解释器中。在主流Python中,事情是按进程进行的,您可能希望最小化进程之间上下文切换的数量。最低要求是每次连接只发送一次。