非阻塞io模型,阻塞io模型

非阻塞io模型
import socket
import time

server=socket.socket()
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(('127.0.0.1',8083))
server.listen(5)

server.setblocking(False) #設置不阻塞
r_list=[] #用來存儲全部來請求server端的conn鏈接
w_list={} #用來存儲全部已經有了請求數據的conn的請求數據

while 1:
try:
conn,addr=server.accept() #不阻塞,會報錯
r_list.append(conn) #爲了將鏈接保存起來,否則下次循環的時候,上一次的鏈接就沒有了
except BlockingIOError:
# 強調強調強調:!!!非阻塞IO的精髓在於徹底沒有阻塞!!!
# time.sleep(0.5) # 打開該行註釋純屬爲了方便查看效果
print('在作其餘的事情')
# print('rlist: ',len(r_list))
# print('wlist: ',len(w_list))


# 遍歷讀列表,依次取出套接字讀取內容
del_rlist=[] #用來存儲刪除的conn鏈接
for conn in r_list:

try:
data=conn.recv(1024) #不阻塞,會報錯
if not data: #當一個客戶端暴力關閉的時候,會一直接收b'',別忘了判斷一下數據
conn.close()
del_rlist.append(conn)
continue
w_list[conn]=data.upper()


except BlockingIOError: # 沒有收成功,則繼續檢索下一個套接字的接收
continue
except ConnectionResetError: # 當前套接字出異常,則關閉,而後加入刪除列表,等待被清除
conn.close()
del_rlist.append(conn)


# 遍歷寫列表,依次取出套接字發送內容
del_wlist=[]
for conn,data in w_list.items():
try:
conn.send(data)
del_wlist.append(conn)
except BlockingIOError:
continue


# 清理無用的套接字,無需再監聽它們的IO操做
for conn in del_rlist:
r_list.remove(conn)
#del_rlist.clear() #清空列表中保存的已經刪除的內容
for conn in del_wlist:
w_list.pop(conn)
#del_wlist.clear()
#非阻塞io模型import socketimport timeserver=socket.socket()server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)server.bind(('127.0.0.1',8083))server.listen(5)print('你看看卡在哪')server.setblocking(False)while 1:    try:        conn, addr = server.accept()        print('來自%s的連接請求'%addr)    except BlockingIOError:        print('去買點藥')    time.sleep(0.1)
相關文章
相關標籤/搜索