1. 程式人生 > >服務端單程序實現併發

服務端單程序實現併發

服務端單程序實現併發

單程序實現併發的原理其實就是利用了系統的回收機制,如果記憶體中的資料沒有任何變數進行指向的話,那麼我們就叫這個資料ip的對映數為0,系統會自動的對對映數為0的資料ip進行清空

單程序中,服務端本來每次只能執行一個,但是如果使用變數進行接收到server建立的new_server則不會導致new_server被清空,還是可以繼續執行

具體程式碼如下

from socket import *


def main():
    # 建立物件
    server = socket(AF_INET, SOCK_STREAM)
    server.setsockopt(
SOL_SOCKET, SO_REUSEADDR, 1) # 設定不阻塞 server.setblocking(False) # 設定為掛起狀態 server.bind(('', 8888)) # 設定為監聽狀態 server.listen() # 建立一個列表用來暫時儲存建立的物件 save_lists = [] while True: # 接收資料 try: new_server, client_info = server.accept() # 建立之後的新套接字也需要進行取消其阻塞性
new_server.setblocking(False) print(f'使用者{client_info}已經連線') # 如果已經有客戶端連線則進行相關的操作 save_lists.append((new_server, client_info)) except: pass # 在列表中找出對應的物件進行資料獲取 for sockets, link in save_lists: # 不管前面是否異常,都需要對列表中的資料進行遍歷
try: data = sockets.recv(1024) except: # 出現異常表明客戶端還沒有傳送資料過來 pass else: if data: # 如果是有資料的則表明有資料傳輸過來 # 列印對應的資料 print(f'來自使用者{link}的資料{sockets}') else: # 如果沒有資料則表明對方要斷開連線 sockets.close() # 關閉之後將對應的的連線從列表中刪除 save_lists.remove((sockets, link)) if __name__ == '__main__': main()

save_list就是用來暫時儲存的,list本身的每個索引都可以當做是一個變數,那麼建立好物件之後扔進這個裡面相當於就是變數賦值,這就是保證了物件有對映,遍歷列表從而將物件提取出來

使用死迴圈進行一直執行,而且都設定了無阻塞的方式,其實這個程式就會執行的非常快,非常消耗cpu,不出錯的話這個程式就把cpu佔滿.沒有什麼實際意義,就是聯絡一些

主要的思想在於使用中間變數進行暫時儲存,之後再用遍歷的方式進行鍼對每個物件依次進行取出執行,從而實現了單程序併發