源碼: Lib/selectors.py
概述
這個模塊允許高級和高效的I/O多路複用,建立在選擇模塊原語之上。鼓勵用戶使用此模塊,除非他們希望對所使用的os級原語進行精確控制。
它定義了一個BaseSelector抽象基類,以及幾個具體的實現(KqueueSelector,EpollSelector…),可以用於在多個文件對象上等待I/O就緒通知。在下文“文件對象”指任何具有fileno()方法或原始文件描述符的對象。
DefaultSelector是當前平臺上可用的最有效實現的別名:這應該是大多數用戶的默認選擇。
類
類層次結構:
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
events是一個位掩碼,指示在給定文件對象上應該等待哪些I/O事件。它可以是下列模塊常量的組合:
常數 含義
EVENT_READ 可讀
EVENT_WRITE 可寫
class selectors.SelectorKey
SelectorKey是一個命名元組,用於將文件對象關聯到其基礎文件描述符、選定的事件掩碼和附加數據。它由幾個BaseSelector方法返回。
fileobj
註冊的文件對象。
fd
文件描述符。
events
在此文件對象上等待的事件。
data
與此文件對象關聯的可選不透明數據。
class selectors.BaseSelector
BaseSelector用於等待多個文件對象上的I/O事件準備就緒。它支持文件流注冊、取消註冊,以及等待這些流上的I/O事件的方法(帶有可選的超時)。它是一個抽象基類,因此不能實例化。
如果你想使用一個實現,並且你的平臺支持它,可以使用DefaultSelector,或者SelectSelector, KqueueSelector等等。BaseSelector及其具體實現支持上下文管理器協議。
abstractmethod register(fileobj, events, data=None)
註冊一個文件對象進行選擇,監視它的I/O事件。
fileobj是要監視的文件對象。它可以是一個整數文件描述符,也可以是一個具有fileno()方法的對象。事件是要監視的事件的位掩碼。數據是一個不透明的對象。
這會返回一個新的SelectorKey實例,或者在事件掩碼或文件描述符無效的情況下引發一個ValueError,或者在文件對象已經註冊的情況下引發一個KeyError。
abstractmethod unregister(fileobj)
取消註冊的文件對象,從監視中刪除它。一個文件對象在被關閉之前應該被取消註冊。
fileobj必須是先前註冊的文件對象。
這會返回相關的SelectorKey實例,或者在fileobj未註冊時引發一個鍵錯誤。如果fileobj無效(例如它沒有fileno()方法,或者它的fileno()方法有一個無效的返回值),它將引發ValueError。
modify(fileobj, events, data=None)
更改已註冊文件對象的監視事件或附加數據。
這相當於BaseSelector.unregister(fileobj)()後面跟着BaseSelector。寄存器(fileobj,事件,數據)(),除了它可以更有效地實現。
這將返回一個新的SelectorKey實例,或者在事件掩碼或文件描述符無效的情況下引發一個ValueError,或者在文件對象未註冊的情況下引發一個KeyError。
abstractmethod select(timeout=None)
等待,直到已註冊的文件對象就緒,或者超時過期。
如果超時>爲0,則指定最大等待時間,以秒爲單位。如果timeout <= 0,調用將不會阻塞,並將報告當前準備好的文件對象。如果timeout爲None,調用將阻塞,直到被監視的文件對象就緒。
這將返回一個元組(鍵、事件)列表,每個元組對應一個就緒文件對象。
key是SelectorKey實例,對應於一個就緒文件對象。events是這個文件對象上準備好的事件的位掩碼。
close()
關閉選擇器。必須調用它以確保釋放所有底層資源。選擇器一旦關閉,就不能使用。
get_key(fileobj)
返回與註冊文件對象關聯的鍵。
這將返回與此文件對象關聯的SelectorKey實例,或者在文件對象未註冊時引發KeyError。
abstractmethod get_map()
返回文件對象到選擇器鍵的映射。
這將返回一個映射實例,將註冊的文件對象映射到它們關聯的SelectorKey實例。
class selectors.DefaultSelector
默認選擇器類,使用當前平臺上可用的最有效實現。這應該是大多數用戶的默認選擇。
class selectors.SelectSelector
select.select()-based selector.
class selectors.PollSelector
select.poll()-based selector.
class selectors.EpollSelector
select.epoll()-based selector.
fileno()
這將返回基礎select.epoll()對象使用的文件描述符。
class selectors.DevpollSelector
select.devpoll()-based selector.
fileno()
這將返回基礎select.devpoll()對象使用的文件描述符。
class selectors.KqueueSelector
select.kqueue()-based selector.
fileno()
這將返回底層select.kqueue()對象使用的文件描述符。