執行緒池版的SocketServer

2021-08-30 03:40:07 字數 2191 閱讀 6256

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...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...