服務端單程序實現併發
阿新 • • 發佈:2019-01-14
服務端單程序實現併發
單程序實現併發的原理其實就是利用了系統的回收機制,如果記憶體中的資料沒有任何變數進行指向的話,那麼我們就叫這個資料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佔滿.沒有什麼實際意義,就是聯絡一些
主要的思想在於使用中間變數進行暫時儲存,之後再用遍歷的方式進行鍼對每個物件依次進行取出執行,從而實現了單程序併發