5

我试图让使用BaseHttpServer这是基于SocketServer的 其中有2个异步混入(ThreadingMixIn和ForkingMixIn)是否有用于SocketServer的ThreadingMixIn和ForkingMixIn的任何池?

与这两个,他们对每个请求的工作问题(分配一个新的线程或叉HTTP代理每个请求都有一个新的子进程)

是否存在一个Mixin,它利用了每个 中的4个子进程和40个线程池,因此请求会被那些已创建的线程处理?

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

回答

1

我已经开始解决该问题

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

也许你想和我一起完成待办事项(CTRL + C后清理)

+0

我可能需要将它与基于eventlet的服务器进行比较,如https://pypi.python.org/pypi/Spawning/ – 2013-03-25 12:40:40

+0

这不再适用于py 2.7。尝试演示时出现此错误:pickle.PicklingError:不能pickle :找不到thread.lock – OriginalCliche 2016-10-21 16:21:22

+0

我正在使用py 2.7,而且我的代码没有腌任何东西 – 2016-10-22 12:53:08

5

你可以使用一个池从项目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的主要用例用于测试目的。

+0

this类似于使用多处理池,这不是最优的解决方案,例如它涉及队列和pickles ..等等。请参阅[我的解决方案](https://github.com/muayyad-alsadi/python-PooledProcessMixIn/wiki)功能。 – 2012-08-28 09:03:10

+0

@muayyad:1.这个以及stdlib类是用于开发/测试的目的2.我可以期望上述工作由于其简单性。我不能说你的解决方案是一样的3.你有任何基准? – jfs 2012-08-28 09:36:36

+1

@ j-f-sebastian:我使用围攻来进行基准测试,它将性能提高了一倍(mine trans Rate:1530,其他mixin大概为800) – 2012-10-14 12:28:38

相关问题