python IO多路複用

python中IO多路複用

IO多路複用中包括 select、pool、epoll,這些都是阻塞IO

1. select

  1. 功能:
    • 監控(關注)多個IO,
    • 如果某個IO處於就緒狀態
    • 則立即返回、通知應用程序
  2. 實現
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

  1. poll和select原理一樣,監控多個IO的狀態,並返回給應用程序
  2. 實現
    事件:[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

  1. 是poll的改進版,針對數量較多的IO情況
    性能更好
  2. 在獲取事件時候,不需要遍歷所有被監控的IO
    只需遍歷產生了事件被喚醒的那部分
  3. 提供了更豐富的觸發機制
    1. 水平觸發:當IO上有事件的時候,epoll會發出事件通知,如果IO上沒有進行操作下次調用epoll時候還會進行通知
    2. 邊緣觸發:當IO上有事件發生時,只通知一次就算是IO事件沒有被處理,直到再次出現事件的時候才通知
  4. 使用:poll對象的函數改成epoll即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章