如何利用sockserver模組程式設計實現客戶端併發

疯狂Python發表於2024-08-19

前面用sock模組寫的服務端和客戶端,存在一個大問題,就是當執行多個客戶端的時候,必須等一個客戶端執行結束,另一個客戶端才能實現與服務端的交流,這顯然不符合現實中的需求。有沒有什麼辦法解決這個問題呢?有人說沒有,屁話。當然有,這就需要用到一個sockserver的模組,用定義類繼承類的方式來完成程式設計,上程式碼:

服務端:

#匯入sockserver模組
import socketserver

ip_porf=('127.0.0.1',8080)

#自定義一個Myserver類,並繼承基類
class Myserver(socketserver.BaseRequestHandler):
    #改寫基類的handle方法,固定寫法,必須有這個。
    def handle(self):
        while True:
            #接收來自客戶端的訊息
            data=self.request.recv(1024)
            #傳送訊息到客戶端
            self.request.sendall(data.upper())

if __name__ == '__main__':
    s=socketserver.ThreadingTCPServer(ip_porf,Myserver)
    print('服務端開始執行...')
    s.serve_forever()

客戶端:

from socket import *
ip_port=('127.0.0.1',8080)

#例項化一個sock的TCP協議的物件
socket_client=socket(AF_INET,SOCK_STREAM)
socket_client.connect(ip_port)

while True:
    msg=input('---->:')
    if not msg:continue
    if msg=='quit':break
    socket_client.sendall(msg.encode('utf-8'))
    data=socket_client.recv(1024)
    print('返回的結果是:%s' %data.decode('utf-8'))
socket_client.close()

按照上面的程式碼寫法,就可以實現客戶端併發,也就是說可以同時多個客戶端訪問服務端並與服務端資料互動。


科普下:並行和併發?同步和非同步?

並行:多顆cpu同時執行多個任務
併發:一個或多顆cpu透過輪詢切換任務的模式執行多項任務
其中,並行是併發的子集

是不是感覺一頭霧水,那是因為你不瞭解計算機中cpu處理任務的邏輯,下面我來給你講透徹。
假設你的電腦上只有一顆cpu,但是你聽音樂的同時又想做PPT,實際上你的電腦的確可以做到這些。表面上看你的電腦似乎同時在做兩件事,其實不是的,是cpu輪詢切換的結果。
cpu工作同時存在兩種機制(兩種機制共同作用):
第一是當遇到IO阻塞,先去處理別的任務,如等待客戶端輸入資訊。
第二是每隔很短的時間,cpu就會透過輪詢在不同任務間來回切換,你之所以覺察不到,是因為速度太快了。

同步:假設有A和B兩個任務在執行,先執行A,當A遇到IO阻塞,B就等著A。等A徹底執行完了才會執行B。--效率低
非同步:假設有A和B兩個任務在執行,先執行A,當A遇到IO阻塞,先執行B,等回過頭來再執行A,保持CPU始終處於工作狀態。--效率高

相關文章