Python 基于教育目的的HTTP代理服务器设计

Python 基于教育目的的HTTP代理服务器设计,python,multithreading,sockets,Python,Multithreading,Sockets,出于教育目的,我正在编写一个HTTP代理服务器。在这个服务器中,我想从使用多处理器内核中获益,因为有一些任务显然可以并行完成 我们有0-5个HTTP请求处理步骤,每个步骤对应1或2个IO操作。步骤描述非常简单,可以在图表上看到。并行的想法如下: 1“侦听”方法只需侦听s套接字和接受s传入连接 2“调度程序”方法: -等待选择功能以获取可用于进一步分配的FD -将可用的FD(连接)放入请求集中。也许最好将其称为TaskSet,因为任务出现在读取HTTP请求之前。每个任务至少有 [当前fd(每一步

出于教育目的,我正在编写一个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实现的,那么我应该使用不带GIL的Python实现(比如IronPython)。使用常规的CPython,我不会从同步记录/写入的少数内核中获益(同时在被阻止时仍能正确利用时间)?

我建议将这些步骤用于教育项目

  • 多处理
    模块中,详细阅读。您可能希望创建一个工作池,其大小与cpu的数量成一定比例(请参见
    cpu\u count()

  • 详细阅读,尤其是
    多处理.Queue
    多处理.Manager
    。您可能希望创建一个
    队列
    ,并将其传递给所有池工作者

  • 在创建
    管理器
    队列
    之后,在单个进程中循环和
    接受
    传入连接。将每个接受的连接推送到
    队列
    。每个池工作线程都应该循环并从此
    队列
    获取连接(这将在没有连接时阻止它们)。当工作程序发现这样的连接时,它应该进一步处理它

  • 这将相对较好地利用您的核心


    注意页面中有一个很好的例子,搜索“一个工作进程池如何在共享一个侦听套接字时运行一个SimpleHTTPServer.HttpServer实例的示例”。

    我建议您仔细阅读一下,我需要a)有一些投资组合项目,b)练习多线程应用程序设计。执行常见且多次实施的任务对我的目标有好处a)易于向非开发人员的客户演示b)每个人都应该知道实现这一点的常用方法,因此很容易判断我的解决方案是否正确。我错了吗?我建议你以后明确说明这个问题是出于教育目的。谢谢你回复相关的API。您提出了按连接划分流的多进程方法(而不是按步骤划分的多线程方法)。为什么您更喜欢它呢?首先,这种方法使您回到主流Python解释器中。在主流Python中,事情是按进程进行的,您可能希望最小化进程之间上下文切换的数量。最低要求是每次连接只发送一次。