socketserver多執行緒處理

2022-07-04 04:30:13 字數 4007 閱讀 1273

socketserver簡化了網路伺服器的編寫。在進行socket建立時,使用socketserver會大大減少建立的步驟,並且socketserver使用了select它有5個類:baseserver,tcpserver,udpserver,unixstreamserver,unixdatagramserver。後4個類是同步進行處理的,另外通過forkingmixin和threadingmixin類來支援非同步。

socketserver的5個類的繼承關係

socketserver內部使用 io多路復用 以及 「多執行緒」 和 「多程序」 ,從而實現併發處理多個客戶端請求的socket服務端。即:每個客戶端請求連線到伺服器時,socket服務端都會在伺服器是建立乙個「執行緒」或者「進 程」 專門負責處理當前客戶端的所有請求。

一是server類:baseserver/tcpserver/udpserver用來接收客戶的請求。tcpserver處理tcp請求,udpserver處理udp請求。baserserver是基類,不能直接使用。tcpserver繼承自baseserver,udpserver繼承自tcpserver。

二是handler類:baserequesthandler/datagramrequesthandler/streamrequesthandler用來處理每乙個客戶請求。一般用使用baserequesthandler就行,但streamrequesthandler/datagramrequesthandler提供了一些特別的功能,前者用來處理流式(tcp)請求,後者處理資料報(udp)請求。server每收到乙個客戶請求就會建立乙個handler類示例來處理該請求。預設情況下,tcpserver/udpserver是單程序單執行緒的模型,依次處理每個客戶請求,乙個請求處理完畢才能接著處理下乙個請求。

三是mixin類:forkingmixin/threadingmixin用來為server提供多程序/多執行緒併發處理能力的。forkingmixin是多程序模型,threadingmixin是多執行緒模型。這裡特別巧妙的是,你只要建立乙個類,同時繼承server類和mixin類就能自動獲得併發處理請求的能力。該模組本身就直接提供了這種類。

class forkingudpserver(forkingmixin, udpserver): pass

class forkingtcpserver(forkingmixin, tcpserver): pass

class threadingudpserver(threadingmixin, udpserver): pass

class threadingtcpserver(threadingmixin, tcpserver): pass三

server.handle_request()   只處理乙個請求

server.forever()      處理多個請求,一直執行

簡單的接收客戶端傳送的資訊,並將其轉換成大寫,再返回給客戶端

服務端: 

# -*- coding: utf-8 -*-

import socketserver

class mytcphandler(socketserver.baserequesthandler):

"""the request handler class for our server.

it is instantiated once per connection to the server, and must

override the handle() method to implement communication to the

client.

"""def handle(self):

while true: # 多次接收客戶端資訊

# self.request is the tcp socket connected to the client

self.data = self.request.recv(1024).strip()

print("{} wrote:".format(self.client_address[0]))

print(self.data)

# just send back the same data, but upper-cased

self.request.sendall(self.data.upper())

if __name__ == "__main__":

host, port = "localhost", 9999

# create the server, binding to localhost on port 9999

server = socketserver.tcpserver((host, port), mytcphandler)

# activate the server; this will keep running until you

# interrupt the program with ctrl-c

server.serve_forever()

客戶端:

# -*- coding: utf-8 -*-

import socket

client = socket.socket()

client.connect(('localhost', 9999))

while true:

msg = input('>>:').strip()

if not msg:

continue

else:

client.send(msg.encode('utf-8'))

updata = client.recv(1024)

print(updata.decode())

到目前為止我們所有的c/s連線都同時只能處理乙個客戶端請求,多個客戶端請求時,要等前面的客戶端請求關閉後才能執行,包括上面的**也是。如果想讓socketserver併發起來, 必須選擇使用以下乙個多併發的類:

class socketserver.forkingtcpserver

class socketserver.forkingudpserver

class socketserver.threadingtcpserver

class socketserver.threadingudpserver

只需要改變乙個地方就可以了

server = socketserver.tcpserver((host, port), mytcphandler)
服務端:

import socketserver

class mytcphandler(socketserver.baserequesthandler):

def handle(self):

while true:

# self.request is the tcp socket connected to the client

self.data = self.request.recv(1024).strip()

print("{} wrote:".format(self.client_address[0]))

print(self.data)

# just send back the same data, but upper-cased

self.request.sendall(self.data.upper())

if __name__ == "__main__":

host, port = "localhost", 9999

server = socketserver.threadingtcpserver((host, port), mytcphandler)

server.serve_forever()

執行緒池版的SocketServer

python的socketserver模組提供了乙個開發socket server的捷徑。但是其自帶的非同步handler threadingmixin每次處理請求是都會產生乙個新的執行緒,在負載較重的時候會有一些問題。需要乙個使用執行緒池的tcpserver.具體的 如下 繼承自tcpserver...

執行緒池版的SocketServer

python的socketserver模組提供了乙個開發socket server的捷徑。但是其自帶的非同步handler threadingmixin每次處理請求是都會產生乙個新的執行緒,在負載較重的時候會有一些問題。需要乙個使用執行緒池的tcpserver.具體的 如下 from threadi...

多執行緒 多執行緒原理

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...