它的功能與linux的epoll,還是select模塊,poll等類似;實現高效的I/O multiplexing, 常用於非阻塞的socket的編程中; 簡單介紹一下這個模塊,更多內容查看 python文檔:https://docs.python.org/3/library/selectors.html
1. 模塊定義了一個 BaseSelector的抽象基類, 以及它的子類,包括:SelectSelector, PollSelector, EpollSelector, DevpollSelector, KqueueSelector.
另外還有一個DefaultSelector類,它其實是以上其中一個子類的別名而已,它自動選擇為當前環境中最有效的Selector,所以平時用 DefaultSelector類就可以了,其它用不着。
2. 模塊定義了兩個常量,用於描述 event Mask
EVENT_READ : 表示可讀的; 它的值其實是1;
EVENT_WRITE: 表示可寫的; 它的值其實是2;
3. 模塊定義了一個 SelectorKey類, 一般用這個類的實例 來描述一個已經注冊的文件對象的狀態, 這個類的幾個屬性常用到:
fileobj: 表示已經注冊的文件對象;
fd: 表示文件對象的描述符,是一個整數,它是文件對象的 fileno()方法的返回值;
events: 表示注冊一個文件對象時,我們等待的events, 即上面的event Mask, 是可讀呢還是可寫呢!!
data: 表示注冊一個文件對象是邦定的data;
4. 最后說說抽象基類中的方法;
register(fileobj, events, data=None) 作用:注冊一個文件對象。
參數: fileobj——即可以是fd 也可以是一個擁有fileno()方法的對象;
events——上面的event Mask 常量; data
返回值: 一個SelectorKey類的實例;
unregister(fileobj) 作用: 注銷一個已經注冊過的文件對象;
返回值:一個SelectorKey類的實例;
modify(fileobj, events, data=None) 作用:用於修改一個注冊過的文件對象,比如從監聽可讀變為監聽可寫;它其實就是register() 后再跟unregister(), 但是使用modify( ) 更高效;
返回值:一個SelectorKey類的實例;
select(timeout=None) 作用: 用於選擇滿足我們監聽的event的文件對象;
返回值: 是一個(key, events)的元組, 其中key是一個SelectorKey類的實例, 而events 就是 event Mask(EVENT_READ或EVENT_WRITE,或者二者的組合)
close
() 作用:關閉 selector。 最后一定要記得調用它, 要確保所有的資源被釋放;
get_key(fileobj) 作用: 返回注冊文件對象的 key;
返回值 :一個SelectorKey類的實例;
Ok,就這樣吧!