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。
執行緒池版的SocketServer
python的socketserver模組提供了乙個開發socket server的捷徑。但是其自帶的非同步handler threadingmixin每次處理請求是都會產生乙個新的執行緒,在負載較重的時候會有一些問題。需要乙個使用執行緒池的tcpserver.具體的 如下 繼承自tcpserver...
python 執行緒池 Python的執行緒池
usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...