新聞中心
select —- 等待 I/O 完成
該模塊提供了對(duì) select() 和 poll() 函數(shù)的訪問,這些函數(shù)在大多數(shù)操作系統(tǒng)中是可用的。在 Solaris 及其衍生版本上可用 devpoll(),在 Linux 2.5+ 上可用 epoll(),在大多數(shù) BSD 上可用 kqueue()。注意,在 Windows 上,本模塊僅適用于套接字;在其他操作系統(tǒng)上,本模塊也適用于其他文件類型(特別地,在 Unix 上也適用于管道)。本模塊不能用于常規(guī)文件,不能檢測(cè)出(自上次讀取文件后)文件是否有新數(shù)據(jù)寫入。

備注
selectors 模塊是在 select 模塊原型的基礎(chǔ)上進(jìn)行高級(jí)且高效的 I/O 復(fù)用。推薦用戶改用 selectors 模塊,除非用戶希望對(duì) OS 級(jí)的函數(shù)原型進(jìn)行精確控制。
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.
該模塊定義以下內(nèi)容:
exception select.error
一個(gè)被棄用的 OSError 的別名。
在 3.3 版更改: 根據(jù) PEP 3151,這個(gè)類是 OSError 的別名。
select.devpoll()
(僅支持 Solaris 及其衍生版本)返回一個(gè) /dev/poll 輪詢對(duì)象,請(qǐng)參閱下方 /dev/poll 輪詢對(duì)象 獲取 devpoll 對(duì)象所支持的方法。
devpoll() 對(duì)象與實(shí)例化時(shí)允許的文件描述符數(shù)量有關(guān),如果在程序中降低了此數(shù)值,devpoll() 調(diào)用將失敗。如果程序提高了此數(shù)值,devpoll() 可能會(huì)返回一個(gè)不完整的活動(dòng)文件描述符列表。
新的文件描述符是 不可繼承的。
3.3 新版功能.
在 3.4 版更改: 新的文件描述符現(xiàn)在是不可繼承的。
select.epoll(sizehint=- 1, flags=0)
(僅支持 Linux 2.5.44 或更高版本)返回一個(gè) edge poll 對(duì)象,該對(duì)象可作為 I/O 事件的邊緣觸發(fā)或水平觸發(fā)接口。
sizehint informs epoll about the expected number of events to be registered. It must be positive, or -1 to use the default. It is only used on older systems where epoll_create1() is not available; otherwise it has no effect (though its value is still checked).
flags 已經(jīng)棄用且完全被忽略。但是,如果提供該值,則它必須是 0 或 select.EPOLL_CLOEXEC,否則會(huì)拋出 OSError 異常。
請(qǐng)參閱下方 邊緣觸發(fā)和水平觸發(fā)的輪詢 (epoll) 對(duì)象 獲取 epoll 對(duì)象所支持的方法。
epoll 對(duì)象支持上下文管理器:當(dāng)在 with 語(yǔ)句中使用時(shí),新建的文件描述符會(huì)在運(yùn)行至語(yǔ)句塊結(jié)束時(shí)自動(dòng)關(guān)閉。
新的文件描述符是 不可繼承的。
在 3.3 版更改: 增加了 flags 參數(shù)。
在 3.4 版更改: 增加了對(duì) with 語(yǔ)句的支持。新的文件描述符現(xiàn)在是不可繼承的。
3.4 版后已移除: flags 參數(shù)?,F(xiàn)在默認(rèn)采用 select.EPOLL_CLOEXEC 標(biāo)志。使用 os.set_inheritable() 來讓文件描述符可繼承。
select.poll()
(部分操作系統(tǒng)不支持)返回一個(gè) poll 對(duì)象,該對(duì)象支持注冊(cè)和注銷文件描述符,支持對(duì)描述符進(jìn)行輪詢以獲取 I/O 事件。請(qǐng)參閱下方 Poll 對(duì)象 獲取 poll 對(duì)象所支持的方法。
select.kqueue()
(僅支持 BSD)返回一個(gè)內(nèi)核隊(duì)列對(duì)象,請(qǐng)參閱下方 Kqueue 對(duì)象 獲取 kqueue 對(duì)象所支持的方法。
新的文件描述符是 不可繼承的。
在 3.4 版更改: 新的文件描述符現(xiàn)在是不可繼承的。
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)
(僅支持 BSD)返回一個(gè)內(nèi)核事件對(duì)象,請(qǐng)參閱下方 Kevent 對(duì)象 獲取 kevent 對(duì)象所支持的方法。
select.select(rlist, wlist, xlist[, timeout])
這是一個(gè)明白直觀的 Unix select() 系統(tǒng)調(diào)用接口。 前三個(gè)參數(shù)是由‘可等待對(duì)象’組成的序列:可以是代表文件描述符的整數(shù),或是帶有名為 fileno() 的返回這樣的整數(shù)的無形參方法的對(duì)象:
-
rlist:等待,直到可以開始讀取
-
wlist:等待,直到可以開始寫入
-
xlist:等待“異常情況”(請(qǐng)參閱當(dāng)前系統(tǒng)的手冊(cè),以獲取哪些情況稱為異常情況)
允許空的可迭代對(duì)象,但是否接受三個(gè)空的可迭代對(duì)象則取決于具體平臺(tái)。 (已知在 Unix 上可行但在 Windows 上不可行。) 可選的 timeout 參數(shù)以一個(gè)浮點(diǎn)數(shù)表示超時(shí)秒數(shù)。 當(dāng)省略 timeout 參數(shù)時(shí)該函數(shù)將阻塞直到至少有一個(gè)文件描述符準(zhǔn)備就緒。 超時(shí)值為零表示執(zhí)行輪詢且永不阻塞。
返回值是三個(gè)列表,包含已就緒對(duì)象,返回的三個(gè)列表是前三個(gè)參數(shù)的子集。當(dāng)超時(shí)時(shí)間已到且沒有文件描述符就緒時(shí),返回三個(gè)空列表。
可迭代對(duì)象中可接受的對(duì)象類型有 python 文件對(duì)象 (例如 sys.stdin 以及 open() 或 os.popen() 所返回的對(duì)象),由 socket.socket() 返回的套接字對(duì)象等。 你也可以自定義一個(gè) wrapper 類,只要它具有適當(dāng)?shù)?fileno() 方法(該方法要確實(shí)返回一個(gè)文件描述符,而不能只是一個(gè)隨機(jī)整數(shù))。
備注
Windows 上不接受文件對(duì)象,但接受套接字。在 Windows 上,底層的 select() 函數(shù)由 WinSock 庫(kù)提供,且不處理不是源自 WinSock 的文件描述符。
在 3.5 版更改: 現(xiàn)在,當(dāng)本函數(shù)被信號(hào)中斷時(shí),重試超時(shí)將從頭開始計(jì)時(shí),不會(huì)拋出 InterruptedError 異常。除非信號(hào)處理程序拋出異常(相關(guān)原理請(qǐng)參閱 PEP 475)。
select.PIPE_BUF
當(dāng)一個(gè)管道已經(jīng)被 select()、poll() 或本模塊中的某個(gè)接口報(bào)告為可寫入時(shí),可以在不阻塞該管道的情況下寫入的最小字節(jié)數(shù)。它不適用于套接字等其他類型的文件類對(duì)象。
POSIX 上須保證該值不小于 512。
可用性: Unix
3.2 新版功能.
/dev/poll 輪詢對(duì)象
Solaris 及其衍生版本具備 /dev/poll。select() 復(fù)雜度為 O(最高文件描述符),poll() 為 O(文件描述符數(shù)量),而 /dev/poll 為 O(活動(dòng)的文件描述符)。
/dev/poll 的行為與標(biāo)準(zhǔn) poll() 對(duì)象十分類似。
devpoll.close()
關(guān)閉輪詢對(duì)象的文件描述符。
3.4 新版功能.
devpoll.closed
如果輪詢對(duì)象已關(guān)閉,則返回 True。
3.4 新版功能.
devpoll.fileno()
返回輪詢對(duì)象的文件描述符對(duì)應(yīng)的數(shù)字。
3.4 新版功能.
devpoll.register(fd[, eventmask])
在輪詢對(duì)象中注冊(cè)文件描述符。這樣,將來調(diào)用 poll() 方法時(shí)將檢查文件描述符是否有未處理的 I/O 事件。fd 可以是整數(shù),也可以是帶有 fileno() 方法的對(duì)象(該方法返回一個(gè)整數(shù))。文件對(duì)象已經(jīng)實(shí)現(xiàn)了 fileno(),因此它們也可以用作參數(shù)。
eventmask 是可選的位掩碼,用于指定要檢查的事件類型。這些常量與 poll() 對(duì)象所用的相同。本參數(shù)的默認(rèn)值是常量 POLLIN、POLLPRI 和 POLLOUT 的組合。
警告
注冊(cè)已注冊(cè)過的文件描述符不會(huì)報(bào)錯(cuò),但是結(jié)果是不確定的。正確的操作是先注銷或直接修改它。與 poll() 相比,這是一個(gè)重要的區(qū)別。
devpoll.modify(fd[, eventmask])
此方法先執(zhí)行 unregister() 后執(zhí)行 register()。直接執(zhí)行此操作效率(稍微)高一些。
devpoll.unregister(fd)
刪除輪詢對(duì)象正在跟蹤的某個(gè)文件描述符。與 register() 方法類似,fd 可以是整數(shù),也可以是帶有 fileno() 方法的對(duì)象(該方法返回一個(gè)整數(shù))。
嘗試刪除從未注冊(cè)過的文件描述符將被安全地忽略。
devpoll.poll([timeout])
Polls the set of registered file descriptors, and returns a possibly empty list containing (fd, event) 2-tuples for the descriptors that have events or errors to report. fd is the file descriptor, and event is a bitmask with bits set for the reported events for that descriptor —- POLLIN for waiting input, POLLOUT to indicate that the descriptor can be written to, and so forth. An empty list indicates that the call timed out and no file descriptors had any events to report. If timeout is given, it specifies the length of time in milliseconds which the system will wait for events before returning. If timeout is omitted, -1, or None, the call will block until there is an event for this poll object.
在 3.5 版更改: 現(xiàn)在,當(dāng)本函數(shù)被信號(hào)中斷時(shí),重試超時(shí)將從頭開始計(jì)時(shí),不會(huì)拋出 InterruptedError 異常。除非信號(hào)處理程序拋出異常(相關(guān)原理請(qǐng)參閱 PEP 475)。
邊緣觸發(fā)和水平觸發(fā)的輪詢 (epoll) 對(duì)象
https://linux.die.net/man/4/epoll
eventmask
常量
含意
EPOLLIN可讀
EPOLLOUT可寫
EPOLLPRI緊急數(shù)據(jù)讀取
EPOLLERR在關(guān)聯(lián)的文件描述符上有錯(cuò)誤情況發(fā)生
EPOLLHUP關(guān)聯(lián)的文件描述符已掛起
EPOLLET設(shè)置觸發(fā)方式為邊緣觸發(fā),默認(rèn)為水平觸發(fā)
EPOLLONESHOT設(shè)置 one-shot 模式。觸發(fā)一次事件后,該描述符會(huì)在輪詢對(duì)象內(nèi)部被禁用。
EPOLLEXCLUSIVE當(dāng)已關(guān)聯(lián)的描述符發(fā)生事件時(shí),僅喚醒一個(gè) epoll 對(duì)象。默認(rèn)(如果未設(shè)置此標(biāo)志)是喚醒所有輪詢?cè)撁枋龇?epoll 對(duì)象。
EPOLLRDHUP流套接字的對(duì)側(cè)關(guān)閉了連接或關(guān)閉了寫入到一半的連接。
EPOLLRDNORM等同于
EPOLLIN
EPOLLRDBAND可以讀取優(yōu)先數(shù)據(jù)帶。
EPOLLWRNORM等同于
EPOLLOUT
EPOLLWRBAND可以寫入優(yōu)先級(jí)數(shù)據(jù)。
EPOLLMSG忽略
3.6 新版功能: 增加了
EPOLLEXCLUSIVE。僅支持 Linux Kernel 4.5 或更高版本。
epoll.close()
關(guān)閉用于控制 epoll 對(duì)象的文件描述符。
epoll.closed
如果 epoll 對(duì)象已關(guān)閉,則返回 True。
epoll.fileno()
返回文件描述符對(duì)應(yīng)的數(shù)字,該描述符用于控制 epoll 對(duì)象。
epoll.fromfd(fd)
根據(jù)給定的文件描述符創(chuàng)建 epoll 對(duì)象。
epoll.register(fd[, eventmask])
在 epoll 對(duì)象中注冊(cè)一個(gè)文件描述符。
epoll.modify(fd, eventmask)
修改一個(gè)已注冊(cè)的文件描述符。
epoll.unregister(fd)
從 epoll 對(duì)象中刪除一個(gè)已注冊(cè)的文件描述符。
在 3.9 版更改: 此方法不會(huì)再忽略 EBADF 錯(cuò)誤。
epoll.poll(timeout=None, maxevents=- 1)
等待事件發(fā)生,timeout 是浮點(diǎn)數(shù),單位為秒。
在 3.5 版更改: 現(xiàn)在,當(dāng)本函數(shù)被信號(hào)中斷時(shí),重試超時(shí)將從頭開始計(jì)時(shí),不會(huì)拋出 InterruptedError 異常。除非信號(hào)處理程序拋出異常(相關(guān)原理請(qǐng)參閱 PEP 475)。
Poll 對(duì)象
大多數(shù) Unix 系統(tǒng)支持 poll() 系統(tǒng)調(diào)用,為服務(wù)器提供了更好的可伸縮性,使服務(wù)器可以同時(shí)服務(wù)于大量客戶端。poll() 的伸縮性更好,因?yàn)樵撜{(diào)用內(nèi)部?jī)H列出所關(guān)注的文件描述符,而 select() 會(huì)構(gòu)造一個(gè) bitmap,在其中將所關(guān)注的描述符所對(duì)應(yīng)的 bit 打開,然后重新遍歷整個(gè) bitmap。因此 select() 復(fù)雜度是 O(最高文件描述符),而 poll() 是 O(文件描述符數(shù)量)。
poll.register(fd[, eventmask])
在輪詢對(duì)象中注冊(cè)文件描述符。這樣,將來調(diào)用 poll() 方法時(shí)將檢查文件描述符是否有未處理的 I/O 事件。fd 可以是整數(shù),也可以是帶有 fileno() 方法的對(duì)象(該方法返回一個(gè)整數(shù))。文件對(duì)象已經(jīng)實(shí)現(xiàn)了 fileno(),因此它們也可以用作參數(shù)。
eventmask 是可選的位掩碼,用于指定要檢查的事件類型,它可以是常量 POLLIN、POLLPRI 和 POLLOUT 的組合,如下表所述。如果未指定本參數(shù),默認(rèn)將會(huì)檢查所有 3 種類型的事件。
|
常量 |
含意 |
|---|---|
|
有要讀取的數(shù)據(jù) |
|
有緊急數(shù)據(jù)需要讀取 |
|
準(zhǔn)備輸出:寫不會(huì)阻塞 |
|
某種錯(cuò)誤條件 |
|
掛起 |
|
流套接字的對(duì)側(cè)關(guān)閉了連接,或關(guān)閉了寫入到一半的連接 |
|
無效的請(qǐng)求:描述符未打開 |
注冊(cè)已注冊(cè)過的文件描述符不會(huì)報(bào)錯(cuò),且等同于只注冊(cè)一次該描述符。
poll.modify(fd, eventmask)
修改一個(gè)已注冊(cè)的文件描述符,等同于 register(fd, eventmask)。嘗試修改未注冊(cè)的文件描述符會(huì)拋出 OSError 異常,錯(cuò)誤碼為 ENOENT。
poll.unregister(fd)
刪除輪詢對(duì)象正在跟蹤的某個(gè)文件描述符。與 register() 方法類似,fd 可以是整數(shù),也可以是帶有 fileno() 方法的對(duì)象(該方法返回一個(gè)整數(shù))。
嘗試刪除從未注冊(cè)過的文件描述符會(huì)拋出 KeyError 異常。
poll.poll([timeout])
Polls the set of registered file descriptors, and returns a possibly empty list containing (fd, event) 2-tuples for the descriptors that have events or errors to report. fd is the file descriptor, and event is a bitmask with bits set for the reported events for that descriptor —- POLLIN for waiting input, POLLOUT to indicate that the descriptor can be written to, and so forth. An empty list indicates that the call timed out and no file descriptors had any events to report. If timeout is given, it specifies the length of time in milliseconds which the system will wait for events before returning. If timeout is omitted, negative, or None, the call will block until there is an event for this poll object.
在 3.5 版更改: 現(xiàn)在,當(dāng)本函數(shù)被信號(hào)中斷時(shí),重試超時(shí)將從頭開始計(jì)時(shí),不會(huì)拋出 InterruptedError 異常。除非信號(hào)處理程序拋出異常(相關(guān)原理請(qǐng)參閱 PEP 475)。
Kqueue 對(duì)象
kqueue.close()
關(guān)閉用于控制 kqueue 對(duì)象的文件描述符。
kqueue.closed
如果 kqueue 對(duì)象已關(guān)閉,則返回 True。
kqueue.fileno()
返回文件描述符對(duì)應(yīng)的數(shù)字,該描述符用于控制 epoll 對(duì)象。
kqueue.fromfd(fd)
根據(jù)給定的文件描述符創(chuàng)建 kqueue 對(duì)象。
kqueue.control(changelist, max_events[, timeout]) → eventlist
Kevent 的低級(jí)接口
-
changelist 必須是一個(gè)可迭代對(duì)象,迭代出 kevent 對(duì)象,否則置為
None。 -
max_events 必須是 0 或一個(gè)正整數(shù)。
-
timeout 單位為秒(一般為浮點(diǎn)數(shù)),默認(rèn)為
None,即永不超時(shí)。
在 3.5 版更改: 現(xiàn)在,當(dāng)本函數(shù)被信號(hào)中斷時(shí),重試超時(shí)將從頭開始計(jì)時(shí),不會(huì)拋出 InterruptedError 異常。除非信號(hào)處理程序拋出異常(相關(guān)原理請(qǐng)參閱 PEP 475)。
Kevent 對(duì)象
https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
kevent.ident
用于區(qū)分事件的標(biāo)識(shí)值。其解釋取決于篩選器,但該值通常是文件描述符。在構(gòu)造函數(shù)中,該標(biāo)識(shí)值可以是整數(shù)或帶有 fileno() 方法的對(duì)象。kevent 在內(nèi)部存儲(chǔ)整數(shù)。
kevent.filter
內(nèi)核篩選器的名稱。
|
常量 |
含意 |
|---|---|
|
獲取描述符,并在有數(shù)據(jù)可讀時(shí)返回 |
|
獲取描述符,并在有數(shù)據(jù)可寫時(shí)返回 |
|
AIO 請(qǐng)求 |
|
當(dāng)在 fflag 中監(jiān)視的一個(gè)或多個(gè)請(qǐng)求事件發(fā)生時(shí)返回 |
|
監(jiān)視進(jìn)程ID上的事件 |
|
觀察網(wǎng)絡(luò)設(shè)備上的事件 [在 macOS 上不可用] |
|
每當(dāng)監(jiān)視的信號(hào)傳遞到進(jìn)程時(shí)返回 |
|
建立一個(gè)任意的計(jì)時(shí)器 |
kevent.flags
篩選器操作。
|
常量 |
含意 |
|---|---|
|
添加或修改事件 |
|
從隊(duì)列中刪除事件 |
|
Permitscontrol() 返回事件 |
|
禁用事件 |
|
在第一次發(fā)生后刪除事件 |
|
檢索事件后重置狀態(tài) |
|
內(nèi)部事件 |
|
內(nèi)部事件 |
|
篩選特定EOF條件 |
|
請(qǐng)參閱返回值 |
kevent.fflags
篩選特定標(biāo)志。
KQ_FILTER_READ 和 KQ_FILTER_WRITE 篩選標(biāo)志:
|
常量 |
含意 |
|---|---|
|
套接字緩沖區(qū)的低水線 |
KQ_FILTER_VNODE 篩選標(biāo)志:
|
常量 |
含意 |
|---|---|
|
已調(diào)用 unlink() |
|
發(fā)生寫入 |
|
文件已擴(kuò)展 |
|
屬性已更改 |
|
鏈接計(jì)數(shù)已更改 |
|
文件已重命名 |
|
對(duì)文件的訪問權(quán)限已被撤銷 |
KQ_FILTER_PROC filter flags:
|
常量 |
含意 |
|---|---|
|
進(jìn)程已退出 |
|
該進(jìn)程調(diào)用了 fork() |
|
進(jìn)程已執(zhí)行新進(jìn)程 |
|
內(nèi)部篩選器標(biāo)志 |
|
內(nèi)部篩選器標(biāo)志 |
|
跨 fork() 執(zhí)行進(jìn)程 |
|
在 NOTE_TRACK 的子進(jìn)程上返回 |
|
無法附加到子對(duì)象 |
KQ_FILTER_NETDEV 過濾器旗標(biāo) (在 macOS 上不可用):
|
常量 |
含意 |
|---|---|
|
鏈接已建立 |
|
鏈接已斷開 |
|
鏈接狀態(tài)無效 |
kevent.data
篩選特定數(shù)據(jù)。
kevent.udata
用戶自定義值。
網(wǎng)頁(yè)標(biāo)題:創(chuàng)新互聯(lián)Python教程:select—-等待I/O完成
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/dhosoij.html


咨詢
建站咨詢
