select ---等待I/O完成


此模块提供对 select()poll() 在大多数操作系统中可用的功能, devpoll() 在Solaris和衍生产品上提供, epoll() 在Linux 2.5+和 kqueue() 可在大多数BSD上使用。注意,在Windows上,它只适用于套接字;在其他操作系统上,它也适用于其他文件类型(特别是在UNIX上,它适用于管道)。它不能用于常规文件,以确定文件自上次读取以来是否已增长。

注解

这个 selectors 模块允许在 select 模块原语。鼓励用户使用 selectors 而不是模块,除非它们需要对所使用的操作系统级原语进行精确控制。

模块定义如下:

exception select.error

的别名已弃用 OSError .

在 3.3 版更改: 跟随 PEP 3151 ,该类是的别名 OSError .

select.devpoll()

(仅在Solaris和衍生物上受支持。)返回 /dev/poll 轮询对象;请参见第节 /dev/poll 轮询对象 下面是devpoll对象支持的方法。

devpoll() 对象链接到实例化时允许的文件描述符数量。如果你的程序降低了这个值, devpoll() 会失败。如果你的程序增加这个值, devpoll() 可能返回活动文件描述符的不完整列表。

新的文件描述符是 non-inheritable .

3.3 新版功能.

在 3.4 版更改: 新的文件描述符现在不可继承。

select.epoll(sizehint=- 1, flags=0)

(仅在Linux 2.5.44及更高版本上受支持。)返回一个边缘轮询对象,该对象可用作I/O事件的边缘或级别触发接口。

西辛 通知epoll要注册的事件的预期数量。必须是正面的,或者 -1 使用默认值。它仅用于旧系统,其中 epoll_create1() 不可用;否则无效(尽管其值仍处于选中状态)。

flags 已弃用并完全忽略。但是,当提供时,其值必须为 0select.EPOLL_CLOEXEC ,否则 OSError 提高了。

边缘和级别触发器轮询(epoll)对象 下面的部分介绍由epolling对象支持的方法。

epoll 对象支持上下文管理协议:在 with 语句,新的文件描述符将在块末尾自动关闭。

新的文件描述符是 non-inheritable .

在 3.3 版更改: 增加了 flags 参数。

在 3.4 版更改: 支持 with 语句已添加。新的文件描述符现在不可继承。

3.4 版后已移除: 这个 flags 参数。 select.EPOLL_CLOEXEC 现在默认使用。使用 os.set_inheritable() 使文件描述符可继承。

select.poll()

(并非所有操作系统都支持。)返回一个轮询对象,该对象支持注册和注销文件描述符,然后轮询它们以查找I/O事件;请参见第节 轮询对象 下面介绍轮询对象支持的方法。

select.kqueue()

(仅支持BSD。)返回内核队列对象;请参见第节 K队列对象 下面是Kqueue对象支持的方法。

新的文件描述符是 non-inheritable .

在 3.4 版更改: 新的文件描述符现在不可继承。

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

(仅支持BSD。)返回内核事件对象;请参见第节 k事件对象 下面是kevent对象支持的方法。

select.select(rlist, wlist, xlist[, timeout])

这是一个到Unix的简单接口 select() 系统调用。前三个参数是“waitable objects”的iterables:要么是表示文件描述符的整数,要么是具有名为 fileno() 返回这样的整数:

  • 罗列 :等待阅读准备就绪

  • Wistar :等待,直到准备好写入

  • XLIST :等待“异常情况”(请参阅手册页了解系统认为的异常情况)

允许使用空的iterable,但接受三个空iterable取决于平台。(已知它在Unix上工作,但在Windows上不工作。)可选的 超时 参数将超时指定为以秒为单位的浮点数。当 超时 在至少一个文件描述符就绪之前,将忽略函数块参数。超时值为零指定一个轮询且从不阻塞。

返回值是就绪对象列表的三倍:前三个参数的子集。当在文件描述符未准备就绪的情况下达到超时时,将返回三个空列表。

iterable中可接受的对象类型包括Python file objects (例如) sys.stdin 或返回的对象 open()os.popen() )返回的套接字对象 socket.socket() . 您还可以定义 wrapper 只要有合适的 fileno() 方法(它实际上返回一个文件描述符,而不仅仅是一个随机整数)。

注解

不接受Windows上的文件对象,但套接字是。在Windows上, select() 函数由Winsock库提供,不处理不是来自Winsock的文件描述符。

在 3.5 版更改: 当被信号中断时,该函数现在以重新计算的超时重试,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 InterruptedError .

select.PIPE_BUF

当管道被报告为准备写入时,可以在不阻塞管道的情况下写入的最小字节数。 select()poll() 或此模块中的另一个接口。这不适用于其他类型的文件,比如套接字。

POSIX保证该值至少为512。

Availability Unix

3.2 新版功能.

/dev/poll 轮询对象

Solaris和衍生产品 /dev/poll . 同时 select() 是O(最高的文件描述符)和 poll() 是O(文件描述符的数量), /dev/poll 是O(活动文件描述符)。

/dev/poll 行为非常接近标准 poll() 对象。

devpoll.close()

关闭轮询对象的文件描述符。

3.4 新版功能.

devpoll.closed

True 如果轮询对象已关闭。

3.4 新版功能.

devpoll.fileno()

返回轮询对象的文件描述符编号。

3.4 新版功能.

devpoll.register(fd[, eventmask])

向轮询对象注册文件描述符。未来调用 poll() 方法将检查文件描述符是否有任何挂起的I/O事件。 fd 可以是整数,也可以是具有 fileno() 返回整数的方法。文件对象实现 fileno() ,因此它们也可以用作参数。

事件掩码 是描述要检查的事件类型的可选位掩码。常数与 poll() 对象。默认值是常量的组合 POLLINPOLLPRIPOLLOUT .

警告

注册已注册的文件描述符不是错误,但结果未定义。适当的操作是先注销或修改它。这与 poll() .

devpoll.modify(fd[, eventmask])

此方法执行 unregister() 其次是 register() .显式地做同样的事情(稍微)更有效率。

devpoll.unregister(fd)

删除由轮询对象跟踪的文件描述符。就像 register() 方法, fd 可以是整数,也可以是具有 fileno() 返回整数的方法。

删除从未注册的文件描述符的尝试被安全地忽略。

devpoll.poll([timeout])

轮询已注册的文件描述符集,并返回可能包含 (fd, event) 2个元组,用于具有要报告的事件或错误的描述符。 fd 是文件描述符,并且 事件 是为该描述符的报告事件设置了位的位掩码--- POLLIN 对于等待输入, POLLOUT 指示描述符可以写入等等。空列表表示调用超时,没有文件描述符要报告任何事件。如果 timeout 它指定系统在返回之前等待事件的时间长度(毫秒)。如果 timeout 省略了-1,或 None ,调用将被阻止,直到出现此轮询对象的事件。

在 3.5 版更改: 当被信号中断时,该函数现在以重新计算的超时重试,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 InterruptedError .

边缘和级别触发器轮询(epoll)对象

https://linux.die.net/man/4/epoll

事件掩码

常数

意义

EPOLLIN

可供阅读

EPOLLOUT

可供写入

EPOLLPRI

紧急读取数据

EPOLLERR

关联fd发生错误条件

EPOLLHUP

挂机发生在联邦调查局

EPOLLET

设置边缘触发器行为,默认为级别触发器行为

EPOLLONESHOT

设置一次性行为。在拉出一个事件后,fd被内部禁用

EPOLLEXCLUSIVE

当关联的fd有事件时,仅唤醒一个epoll对象。默认(如果未设置此标志)是唤醒FD上的所有epoll对象轮询。

EPOLLRDHUP

流套接字对等端关闭连接或关闭写入一半连接。

EPOLLRDNORM

相当于 EPOLLIN

EPOLLRDBAND

可以读取优先级数据带。

EPOLLWRNORM

相当于 EPOLLOUT

EPOLLWRBAND

可以写入优先级数据。

EPOLLMSG

忽略。

3.6 新版功能: EPOLLEXCLUSIVE 加入。它只受Linux内核4.5或更高版本支持。

epoll.close()

关闭epoll对象的控制文件描述符。

epoll.closed

True 如果epoll对象已关闭。

epoll.fileno()

返回控件fd的文件描述符编号。

epoll.fromfd(fd)

从给定的文件描述符创建epoll对象。

epoll.register(fd[, eventmask])

用epoll对象注册一个fd描述符。

epoll.modify(fd, eventmask)

修改已注册的文件描述符。

epoll.unregister(fd)

从epoll对象中删除已注册的文件描述符。

在 3.9 版更改: 方法不再忽略 EBADF 错误。

epoll.poll(timeout=None, maxevents=- 1)

等待事件。超时(秒)(浮点)

在 3.5 版更改: 当被信号中断时,该函数现在以重新计算的超时重试,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 InterruptedError .

轮询对象

这个 poll() 大多数UNIX系统都支持系统调用,它为同时为许多客户机提供服务的网络服务器提供了更好的可扩展性。 poll() 扩展性更好,因为系统调用只需要列出感兴趣的文件描述符,而 select() 生成位图,为感兴趣的FDS打开位,然后再次对整个位图进行线性扫描。 select() 是O(最高的文件描述符),而 poll() 是O(文件描述符的数量)。

poll.register(fd[, eventmask])

向轮询对象注册文件描述符。未来调用 poll() 方法将检查文件描述符是否有任何挂起的I/O事件。 fd 可以是整数,也可以是具有 fileno() 返回整数的方法。文件对象实现 fileno() ,因此它们也可以用作参数。

事件掩码 是描述要检查的事件类型的可选位掩码,可以是常量的组合 POLLINPOLLPRIPOLLOUT ,见下表。如果未指定,则使用的默认值将检查所有3种类型的事件。

常数

意义

POLLIN

有数据要读取

POLLPRI

有紧急数据要读取

POLLOUT

准备输出:写入不会阻塞

POLLERR

某种类型的错误条件

POLLHUP

挂断调用

POLLRDHUP

流套接字对等端关闭连接,或关闭写入一半连接

POLLNVAL

无效请求:描述符未打开

注册一个已经注册的文件描述符并不是一个错误,它与只注册一次描述符的效果相同。

poll.modify(fd, eventmask)

修改已注册的FD。这和 register(fd, eventmask) . 尝试修改从未注册的文件描述符会导致 OSError errno异常 ENOENT 被引发。

poll.unregister(fd)

删除由轮询对象跟踪的文件描述符。就像 register() 方法, fd 可以是整数,也可以是具有 fileno() 返回整数的方法。

尝试删除从未注册的文件描述符会导致 KeyError 将引发异常。

poll.poll([timeout])

轮询已注册的文件描述符集,并返回可能包含 (fd, event) 2个元组,用于具有要报告的事件或错误的描述符。 fd 是文件描述符,并且 事件 是为该描述符的报告事件设置了位的位掩码--- POLLIN 对于等待输入, POLLOUT 指示描述符可以写入等等。空列表表示调用超时,没有文件描述符要报告任何事件。如果 timeout 它指定系统在返回之前等待事件的时间长度(毫秒)。如果 timeout 省略、否定或 None ,调用将被阻止,直到出现此轮询对象的事件。

在 3.5 版更改: 当被信号中断时,该函数现在以重新计算的超时重试,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 InterruptedError .

K队列对象

kqueue.close()

关闭kqueue对象的控制文件描述符。

kqueue.closed

True 如果kqueue对象已关闭。

kqueue.fileno()

返回控件fd的文件描述符编号。

kqueue.fromfd(fd)

从给定的文件描述符创建kqueue对象。

kqueue.control(changelist, max_events[, timeout]) eventlist

与Kevent的低电平接口

  • changelist必须是kevent对象的iterable,或者 None

  • 最大事件数必须是0或正整数

  • 以秒为单位的超时(可能浮动);默认值为 None ,永远等待

在 3.5 版更改: 当被信号中断时,该函数现在以重新计算的超时重试,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 InterruptedError .

k事件对象

https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

用于标识事件的值。解释取决于过滤器,但它通常是文件描述符。在构造函数中,标识可以是int,也可以是具有 fileno() 方法。kevent在内部存储整数。

kevent.filter

内核筛选器的名称。

常数

意义

KQ_FILTER_READ

获取描述符并在有数据可供读取时返回

KQ_FILTER_WRITE

获取描述符并在有数据可写时返回

KQ_FILTER_AIO

AIO请求

KQ_FILTER_VNODE

当在中监视一个或多个请求的事件时返回 FFLAG 发生

KQ_FILTER_PROC

监视进程ID上的事件

KQ_FILTER_NETDEV

监视网络设备上的事件 [Mac OS X上不可用]

KQ_FILTER_SIGNAL

每当被监视的信号传递到进程时返回

KQ_FILTER_TIMER

建立任意计时器

kevent.flags

过滤动作。

常数

意义

KQ_EV_ADD

添加或修改事件

KQ_EV_DELETE

从队列中删除事件

KQ_EV_ENABLE

permitControl()返回事件

KQ_EV_DISABLE

禁用事件

KQ_EV_ONESHOT

第一次出现后删除事件

KQ_EV_CLEAR

检索事件后重置状态

KQ_EV_SYSFLAGS

内部事件

KQ_EV_FLAG1

内部事件

KQ_EV_EOF

过滤器特定EOF条件

KQ_EV_ERROR

参见返回值

kevent.fflags

筛选特定标志。

KQ_FILTER_READKQ_FILTER_WRITE 过滤器标志:

常数

意义

KQ_NOTE_LOWAT

Socket缓冲器的低水位标记

KQ_FILTER_VNODE 过滤器标志:

常数

意义

KQ_NOTE_DELETE

UNLink() 被称为

KQ_NOTE_WRITE

发生写入

KQ_NOTE_EXTEND

文件已扩展

KQ_NOTE_ATTRIB

属性已更改

KQ_NOTE_LINK

链接计数已更改

KQ_NOTE_RENAME

文件已重命名

KQ_NOTE_REVOKE

对文件的访问被吊销

KQ_FILTER_PROC 过滤器标志:

常数

意义

KQ_NOTE_EXIT

进程已退出

KQ_NOTE_FORK

进程调用了 Frk()

KQ_NOTE_EXEC

进程已执行新进程

KQ_NOTE_PCTRLMASK

内部筛选器标志

KQ_NOTE_PDATAMASK

内部筛选器标志

KQ_NOTE_TRACK

遵循一个流程 Frk()

KQ_NOTE_CHILD

在子进程上返回 NOTE_TRACK

KQ_NOTE_TRACKERR

无法附加到子级

KQ_FILTER_NETDEV 筛选标志(Mac OS X上不可用):

常数

意义

KQ_NOTE_LINKUP

链路上升

KQ_NOTE_LINKDOWN

链接下降

KQ_NOTE_LINKINV

链接状态无效

kevent.data

筛选特定数据。

kevent.udata

用户定义的值。