2015-09-06 73 views
0

我使用TCPHandler进动从客户端套接字TCP请求,但是我遇到的性能问题,我用多线程,该段代码如下时:如何使TCPSERVER多处理

class TCPHandler(SocketServer.StreamRequestHandler): 
    def handle(self): 
     ............. 
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 
if __name__=="__main__": 
    server = ThreadedTCPServer((host, port), TCPHandler) 
     server.serve_forever() 

上面的代码multipleThreading,我怎么把它转换成多处理。

+2

如果您使用的是Python 3.4,可能值得查看[asyncio](https://docs.python.org/3.4/library/asyncio.html)。 –

+0

谢谢Hiro,但是我使用的是python2.6.6,有没有其他的方法可以让它多处理?这可能只是改变一些参数,或者我必须改变代码? python 2 [twisted](https://twistedmatrix.com/trac/)的 – Jack

+0

可能会有所帮助。 (但[罗兰史密斯](http://stackoverflow.com/users/1219295/roland-smith)的答案似乎更简单,希望它能起作用!) –

回答

1

SocketServer.ThreadingMixIn替换为SocketServer.ForkingMixIn以使您的当前代码产生一个进程来处理请求。请注意,这可能不是非常有效,因为启动流程需要时间和资源。如果处理请求所需的时间短于启动新流程所需的时间,则可能会使事情变得更慢。

取决于你在做什么,事件驱动的体系结构可能更合适。对于Python 2,您可能需要查看标准库中的asyncoreasynchat模块。或者twisted框架。请注意,事件驱动的体系结构与现在完全不同,可能需要重写。

+0

谢谢!我的代码有两部分:加载模块和分析模块上的数据库。 MultiThreading可以共享模块(只加载一次),多处理加载模块多次?你是什​​么意思“请注意,这可能不是很有效”,请问?现在我的CPU使用率是10%,我想我真的有很多空间来改善我的代码以使用更多的CPU资源,所以我倾向于使用多处理器。 – Jack

+0

如果数据库在请求处理程序中加载,则应该只加载一次。如果你想共享内存,'multiprocessing'模块提供'Value'和'Array'类。 –

+0

谢谢! SocketServer.ForkingMixIn可以产生多少个默认的最大进程数,我可以在哪里重置? – Jack