開始之前,需要先了解一下什麼會引起程序阻塞和喚醒的事件
(1)向系統請求共享資源失敗。程序在向系統請求共享資源時,由於系統已無足夠的資源分配給它,此時程序因不能繼續執行而轉變為阻塞狀態。
(2)等待某種操作的完成。
當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待操作完成。
(3)新資料尚未達到。
對於相互合作的程序,如果乙個程序需要先獲得另乙個程序提供的資料後才能對該資料進行處理,只要其所需資料尚未到達,程序便只有阻塞。
(4)等待新任務的到達。
在某些作業系統中,特別是在網路環境下的os,往往設定一些特定的系統程序,每當這種程序完成任務後便把自己阻塞起來,等待新任務的到來。
在建立連線和資料傳輸的時候,都會存在等待,就是一種阻塞,一次只能服務乙個客戶端,排隊機制,會存在資源的浪費,cpu的浪費,是不可取的
非阻塞套接字
就是將連線和接收的阻塞位置變成錯誤,再通過try進行捕獲錯誤blockingioerror,pass掉
try建立費阻塞套接字的方法是:: conn,addr =server.accept()
conn.setblocking(false)
except
blockingioerror:
pass
套接字.setblocking(false)用非阻塞建立乙個服務端:可同時處理多個客戶請求
importsocket
server =socket.socket()
server.setblocking(false)
#設定為非阻塞套接字
server.bind(('', 7790))
server.listen(5)
all_conn =
while
true:
try:
conn, addr =server.accept()
conn.setblocking(false)
#新的非阻塞套接字,沒有連線會報錯
儲存記錄連線的客戶端
except blockingioerror: #
捕獲錯誤pass掉
pass
for conn in
all_conn:
try:
recv_data = conn.recv(1024)
ifrecv_data:
print(str(addr) + '
>>>
' +recv_data.decode())
conn.send(recv_data)
else
: conn.close()
all_conn.remove(conn)
except
blockingioerror:
pass
非阻塞套接字
建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...
同步,非同步,阻塞套接字,非阻塞套接字
同 步指的是 傳送方不等接收方響 應,便接著 發下個資料報的通訊方式 異 步指傳送方 發出資料後,等收到接收方 發回的響應,才 發下乙個資料報的通訊方式。阻塞套接字是指執 行此套接字的網路呼叫 時,直到成功才返回,否 則一直阻塞在此網 絡呼叫上,比如呼叫 recv 函式讀 取網路緩 沖區中的資料,如...
非阻塞 connect套接字
非阻塞connect套接字的作用 1 完成乙個connect要花費rtt時間,而rtt波動範圍很大,從區域網上的幾個毫秒甚至是廣域網上的幾秒,這段時間也許有我們要執行的其他處理工作可以執行。2 可以使用這個技術同事建立多個連線。3 許多connect的超時實現以75秒為預設值,如果應用程式想自定義乙...