python的SocketServer模块提供了一个开发socket server的捷径。但是其自带的异步handler ThreadingMixIn每次处理请求是都会产生一个新的线程,在负载较重的时候会有一些问题。需要一个使用线程池的TCPServer.
具体的代码如下:
from threading import Thread
from SocketServer import ThreadingMixIn, TCPServer, BaseRequestHandler
from Queue import Queue, Empty
class PooledThreadTCPServer(TCPServer, object):
def __init__(self, server_address, RequestHandlerClass, thread_num):
super(PooledThreadTCPServer, self).__init__(server_address, RequestHandlerClass)
self.__thread_num = thread_num
self.__queue = Queue()
def __thread_main(self):
while self.__serving:
try:
request, client_address = self.__queue.get(True, 0.5)
except Empty:
continue
self.process_request_thread(request, client_address)
db.close()
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
except:
self.handle_error(request, client_address)
finally:
self.close_request(request)
def process_request(self, request, client_address):
self.__queue.put((request, client_address))
def serve_forever(self):
self.__serving = True
for i in range(self.__thread_num):
t = Thread(target=self.__thread_main)
t.setDaemon(True)
t.start()
super(PooledThreadTCPServer, self).serve_forever()
继承自TCPServer和object。
继承object的原因是需要使用super调用父类的方法,不继承object就可能报错。
process_request方法在有请求到来的时候被调用。
它将request和客户端地址放到一个队列里。
配合一个RequestHandler,就可以轻松的实现一个线程池版的TCPServer
class EchoRequestHandler(BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
if data == "quit":
self.server.shutdown()
self.request.send(data)
if __name__ == "__main__":
addr = ("localhost", 12345)
server = PooledThreadTCPServer(addr, EchoRequestHandler, 10)
server.serve_forever()
需要注意的是,如果RequestHandler中执行的是CPU密集型的操作,那么线程池
无助于提高性能。python同一时间只能有一个线程在运行,无论你有多少CPU。
分享到:
相关推荐
//Runtime的availableProcessors()方法返回当前系统的CPU的数目 //系统的CPU越多,线程池中工作线程的数目也越多 executorService= Executors.newFixedThreadPool( Runtime.getRuntime()....
socketserver FTP资源共享工具
全面的SocketServer
模仿python中的socket以及SocketServer类,做了简单的封装和实现,对些小的测试代码,可以轻松的套用
C# SocketServer、Client通信实例源代码
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这...
python网络编程socketserver[总结].pdf
C++编写的急于windows线程池的多线程服务器
C#\SocketServer
socket只能处理一个client连接,如果需要并发处理多个链接则需要使用socketserver,下面是代码示例以及注释 server端 import socketserver #之前的socket只能同时处理一个客户端,当需要并发处理client发送的信息是...
MAC SocketServer Objective-C语言编写 供大家学习
Select方式实现的socketServer程序示例 在Window平台下VC6.0开发。
SocketServer.rar
SocketServerSocket推送实现代码 SocketServerSocket推送实现代码 SocketServerSocket推送实现代码 SocketServerSocket推送实现代码 SocketServerSocket推送实现代码 SocketServerSocket推送实现代码 SocketServer
VC TCP UDP socketserver client编程例子 0分资料,有学习的下来看看了
文章目录多线程对多客户端socketserver分类(2种)12个类的继承关系(原理)socketserver的实现效果认证链接的合法性加盐(hmac)对暗号 socketserver本质是基于socket进行的一个封装,将多线程并发功能集成到一个新的...
python网络编程socketserver宣贯.pdf