標籤:erro 任務 png 包括 操作 except append 兩種 sele
一、IO模型介紹1、阻塞與非阻塞指的是程式的兩種運行狀態
阻塞:遇到IO就發生阻塞,程式一旦遇到阻塞操作就會停在原地,並且立刻釋放CPU資源
非阻塞(就緒態或運行態):沒有遇到IO操作,或者通過某種手段讓程式即便是遇到IO操作也不會停在原地,執行其他動作,力求儘可能多的佔有CPU
2、同步與非同步指的是提交任務的兩種方式:
同步調用:提交完任務後,就在原地等待,直到任務運行完畢後,拿到任務的傳回值,才繼續執行下一行代碼
非同步呼叫:當進程執行到一個IO(等待外部資料)的時候,不需要等待,待資料接收成功後,再回來處理。
二、阻塞IO模型
預設情況下,所有的socket都是blocking模型,
實際上,除非特別指定,幾乎所有的IO介面 ( 包括socket介面 ) 都是阻塞型的。
這給網路編程帶來了一個很大的問題,如在調用recv(1024)的同時,線程將被阻塞,在此期間,線程將無法執行任何運算或響應任何的網路請求。
blocking IO的特點就是在IO執行的兩個階段(等待資料和拷貝資料兩個階段)都被block了。
三、非阻塞IO模型
在非阻塞式IO中,使用者進程其實是需要不斷的主動詢問kernel資料準備好了沒有。
from socket import *server = socket(AF_INET, SOCK_STREAM)server.bind((‘127.0.0.1‘,8083))server.listen(5)server.setblocking(False)print(‘starting...‘)rlist=[]wlist=[]while True: try: conn, addr = server.accept() rlist.append(conn) print(rlist) except BlockingIOError: # print(‘幹其他的活‘) #收訊息 del_rlist = [] for conn in rlist: try: data=conn.recv(1024) if not data: del_rlist.append(conn) continue wlist.append((conn,data.upper())) except BlockingIOError: continue except Exception: conn.close() del_rlist.append(conn) #發訊息 del_wlist=[] for item in wlist: try: conn=item[0] data=item[1] conn.send(data) del_wlist.append(item) except BlockingIOError: pass for item in del_wlist: wlist.remove(item) for conn in del_rlist: rlist.remove(conn)server.close()
View Code
四、多工IO模型
五、非同步IO模型六、各種IO模型對比七、瞭解selectors模組的使用
15 並發編程-(IO模型)