python中IO多路複用
IO多路複用中包括 select、pool、epoll,這些都是阻塞IO
1. select
- 功能:
- 監控(關注)多個IO,
- 如果某個IO處於就緒狀態
- 則立即返回、通知應用程序
- 實現
rlist = [fd,] #關注讀事件IO列表
wlist = [fd,] #關注寫事件IO列表
xlist = [fd,] #關注異常事件IO列表
timeout #超時事件,可選
rs,ws,xs=select(rlist,wlist,xlist[,timeout]) #阻塞等待事件發生,一般用循環來處理多個事件
print("監控到有IO事件發生")
#遍歷rs,ws,xs ,處理事件
2. poll
- poll和select原理一樣,監控多個IO的狀態,並返回給應用程序
- 實現
事件:[eventmask]
POLLIN 表示IO的讀事件
POLLOUT 表示IO的寫事件
POLLERR 表示IO的異常事件
POLLHUP 表示IO被斷開
POLLNVAL 無效請求
p = poll() # 創建poll對象
p.register(fd, [eventmask]) # 關注io
unregister(fd) #取消關注
events = p.poll() #阻塞,等待IO事件,一般用循環來處理多個事件
#events:文件描述符,就緒事件,遍歷處理事件
3. epoll
- 是poll的改進版,針對數量較多的IO情況
性能更好 - 在獲取事件時候,不需要遍歷所有被監控的IO
只需遍歷產生了事件被喚醒的那部分 - 提供了更豐富的觸發機制
1. 水平觸發:當IO上有事件的時候,epoll會發出事件通知,如果IO上沒有進行操作下次調用epoll時候還會進行通知
2. 邊緣觸發:當IO上有事件發生時,只通知一次就算是IO事件沒有被處理,直到再次出現事件的時候才通知 - 使用:poll對象的函數改成epoll即可