7

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

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

是否有一个 Mixin 使用一个池,比如说 4 个子进程和 40 个线程,所以请求由那些已经创建的线程处理?

因为这将是一个很大的性能提升,我想它会节省一些资源。

4

2 回答 2

13

您可以使用来自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是用于测试目的。

于 2012-08-02T17:56:49.367 回答
3

我已经开始了一个解决这个问题的项目

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

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

于 2012-08-02T16:25:15.050 回答