上篇部落格介紹的套接字因為其阻塞性導致執行緒可能會被一直占用,從而造成乙個服務端只能連線乙個客戶端的現象。在python中,可以將套接字設定為非阻塞型,即在套接字例項化後將setblocking方法的引數改為false。下面看一下非阻塞套接字和阻塞套接字的區別。
對於上述的異常處理,我們統一用try...except。
用非堵塞的accept實現堵塞的accept機制
while true:
try:
a,b = server.accept()
except blockingioerror as error:
pass
用非堵塞的recv實現堵塞的recvt機制
while true:
try:
date = i.recv(1024)
if date:
print("已收到資訊-->{}".format(date.decode()))
i.send(date)
else:
i.close()
except blockingioerror as error:
pass
非堵塞的套接字可以吃滿cpu,不會堵塞發呆。因為其非堵塞,故可以實現併發,讓服務端可以同時連線多個客戶端。下面是服務端的**。
import socket
server = socket.socket()
server.setblocking(false)
server.bind(('127.0.0.5',8520))
server.listen(50)
conn_list =
while true:
try:
a,b = server.accept()
except blockingioerror as error:
pass
for i in conn_list:
try:
date = i.recv(1024)
if date:
print("已收到資訊-->{}".format(date.decode()))
i.send(date)
else:
i.close()
conn_list.remove(i)
except blockingioerror as error:
pass
客戶端的套接字還是保持堵塞,如下:
import socket
client = socket.socket()
client.connect(('127.0.0.5',8520))
mess = input('--->').encode()
client.send(mess)
print("已收到回應-->{}".format(client.recv(1024)))
client.close()
這時可以對此執行客戶端的**,讓服務端同時連線上多個客戶端,然後對客戶端任意次序地對服務端傳送資訊,結果能達到併發的效果。
缺點:運用非阻塞套接字實現的併發雖然可以解決一次與多個客戶端連線,但如果沒有連線過來,那麼accept和recv即send都是無效的,這大大浪費了cpu的利用率,其中的報錯也是無效的cpu花費。
下篇部落格將會講下如何提高cpu的利用率。
非阻塞套接字實現併發
上篇部落格介紹的套接字因為其阻塞性導致執行緒可能會被一直占用,從而造成乙個服務端只能連線乙個客戶端的現象。在python中,可以將套接字設定為非阻塞型,即在套接字例項化後將setblocking方法的引數改為false。下面看一下非阻塞套接字和阻塞套接字的區別。對於上述的異常處理,我們統一用try....
非阻塞套接字
建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...
非阻塞套接字
開始之前,需要先了解一下什麼會引起程序阻塞和喚醒的事件 1 向系統請求共享資源失敗。程序在向系統請求共享資源時,由於系統已無足夠的資源分配給它,此時程序因不能繼續執行而轉變為阻塞狀態。2 等待某種操作的完成。當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待...