SocketServer 的 ThreadingMixIn 和 ForkingMixIn 是不是有任何池?

Posted

技术标签:

【中文标题】SocketServer 的 ThreadingMixIn 和 ForkingMixIn 是不是有任何池?【英文标题】:is there any pool for ThreadingMixIn and ForkingMixIn for SocketServer?SocketServer 的 ThreadingMixIn 和 ForkingMixIn 是否有任何池? 【发布时间】:2012-07-26 19:41:50 【问题描述】:

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

他们处理每个请求的问题(为每个请求分配一个新线程或派生一个新子进程)

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这类似于使用多处理池,这不是最佳解决方案,例如它涉及队列和泡菜..等。请参阅my solution 功能。 @muayyad: 1. 这个以及 stdlib 类用于开发/测试目的 2. 由于其简单性,我可以预期上述工作。我不能对您的解决方案 3 说同样的话。您有任何基准吗? @j-f-sebastian:我用 siege 来做基准测试,它的性能翻了一番(我的 trans Rate:1530,其他 mixins 大约 800)【参考方案2】:

我已经启动了一个项目来解决这个问题

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

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

【讨论】:

我可能需要将它与基于 eventlet 的服务器进行比较,例如 pypi.python.org/pypi/Spawning 这不再适用于 py 2.7。尝试演示时出现此错误:pickle.PicklingError: Can't pickle : it's not found as thread.lock 我使用的是 py 2.7,我的代码没有腌制任何东西

以上是关于SocketServer 的 ThreadingMixIn 和 ForkingMixIn 是不是有任何池?的主要内容,如果未能解决你的问题,请参考以下文章

socketserver hashlib hmac

网络编程_socketserver

socketserver源码解析和协程版socketserver

SocketServer服务

认识socketserver

socketserver实现并发