select ---等待I/O完成¶
此模块提供对 select() 和 poll() 在大多数操作系统中可用的功能, devpoll() 在Solaris和衍生产品上提供, epoll() 在Linux 2.5+和 kqueue() 可在大多数BSD上使用。注意,在Windows上,它只适用于套接字;在其他操作系统上,它也适用于其他文件类型(特别是在UNIX上,它适用于管道)。它不能用于常规文件,以确定文件自上次读取以来是否已增长。
模块定义如下:
- 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 已弃用并完全忽略。但是,当提供时,其值必须为
0或select.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.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()对象。默认值是常量的组合POLLIN,POLLPRI和POLLOUT.警告
注册已注册的文件描述符不是错误,但结果未定义。适当的操作是先注销或修改它。这与
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.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(),因此它们也可以用作参数。事件掩码 是描述要检查的事件类型的可选位掩码,可以是常量的组合
POLLIN,POLLPRI和POLLOUT,见下表。如果未指定,则使用的默认值将检查所有3种类型的事件。常数
意义
POLLIN有数据要读取
POLLPRI有紧急数据要读取
POLLOUT准备输出:写入不会阻塞
POLLERR某种类型的错误条件
POLLHUP挂断调用
POLLRDHUP流套接字对等端关闭连接,或关闭写入一半连接
POLLNVAL无效请求:描述符未打开
注册一个已经注册的文件描述符并不是一个错误,它与只注册一次描述符的效果相同。
- poll.modify(fd, eventmask)¶
修改已注册的FD。这和
register(fd, eventmask). 尝试修改从未注册的文件描述符会导致OSErrorerrno异常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.filter¶
内核筛选器的名称。
常数
意义
KQ_FILTER_READ获取描述符并在有数据可供读取时返回
KQ_FILTER_WRITE获取描述符并在有数据可写时返回
KQ_FILTER_AIOAIO请求
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_ENABLEpermitControl()返回事件
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_READ和KQ_FILTER_WRITE过滤器标志:常数
意义
KQ_NOTE_LOWATSocket缓冲器的低水位标记
KQ_FILTER_VNODE过滤器标志:常数
意义
KQ_NOTE_DELETEUNLink() 被称为
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¶
用户定义的值。