SocketServer有ThreadingMixIn和ForkingMixIn的任何池吗?

时间:2012-07-28 08:30:11

标签: python concurrency asyncsocket python-multithreading socketserver

我试图使用基于SocketServer的BaseHttpServer创建一个http代理 它有2个异步Mixins(ThreadingMixIn和ForkingMixIn)

他们在每个请求上工作的那两个问题(为每个请求分配一个新线程或分叉一个新的子进程)

是否有一个Mixin使用一个池代表4个子进程和每个40个线程 所以请求由已经创建的线程处理?

因为这会带来巨大的性能提升,我想这会节省一些资源。

2 个答案:

答案 0 :(得分:7)

您可以使用concurrent.futures中的池(自Python 3.2以来在stdlib中):

from BaseHTTPServer   import HTTPServer, test
from SimpleHTTPServer import SimpleHTTPRequestHandler
from SocketServer     import ThreadingMixIn

from concurrent.futures import ThreadPoolExecutor # pip install futures

class PoolMixIn(ThreadingMixIn):
    def process_request(self, request, client_address):
        self.pool.submit(self.process_request_thread, request, client_address)

def main():
    class PoolHTTPServer(PoolMixIn, HTTPServer):
        pool = ThreadPoolExecutor(max_workers=40)

    test(HandlerClass=SimpleHTTPRequestHandler, ServerClass=PoolHTTPServer)

if __name__=="__main__":
    main()

正如您所看到的,线程案例的实现相当简单。

如果将其保存到server.py,则可以将其运行为:

$ python -mserver

此命令最多使用40个线程来处理http://your_host:8000/上的请求。

HTTPServer的主要用例是用于测试目的。

答案 1 :(得分:3)

我已经启动了一个解决此问题的项目

https://github.com/muayyad-alsadi/python-PooledProcessMixIn

也许你想和我一起完成TODO(在CTRL + C之后清理)