16.1. 选择—awaitI/O 完成

此模块提供对大多数 os 中可用的select()poll()Function,Linux 2.5 上的epoll()和大多数 BSD 上的kqueue()的访问。请注意,在 Windows 上,它仅适用于套接字。在其他 os 上,它也适用于其他文件类型(特别是在 Unix 上,它适用于管道)。不能在常规文件上使用它来确定自上次读取文件以来文件是否已增长。

该模块定义以下内容:

2.6 版的新Function。

2.6 版的新Function。

2.6 版的新Function。

允许使用空序列,但是否接受三个空序列取决于平台。 (众所周知,它可以在 Unix 上工作,但不能在 Windows 上工作.)可选的* timeout 参数将超时指定为以秒为单位的浮点数。如果Ellipsis timeout *参数,该Function将阻塞直到至少一个文件 Descriptors 准备就绪。超时值为零表示轮询且永不阻塞。

返回值是准备好的对象列表的三倍:前三个参数的子集。在没有准备好文件 Descriptors 的情况下达到超时时,将返回三个空列表。

序列中可接受的对象类型包括 Python 文件对象(例如sys.stdinopen()os.popen()返回的对象),socket.socket()返回的套接字对象。您也可以自己定义* wrapper *类,只要它具有适当的fileno()方法(实际上返回文件 Descriptors,而不仅仅是随机整数)即可。

Note

Windows 上的文件对象是不可接受的,但套接字是可接受的。在 Windows 上,基础select()函数由 WinSock 库提供,并且不处理不是源自 WinSock 的文件 Descriptors。

2.7 版的新Function。

16.1.1. 边缘和水平触发轮询(epoll)对象

Note

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

eventmask

Constant Meaning
EPOLLIN 可供阅读
EPOLLOUT 可写
EPOLLPRI 紧急数据读取
EPOLLERR 错误状况发生在 assoc 上。 fd
EPOLLHUP 挂断发生在 assoc 上。 fd
EPOLLET 设置边缘触发行为,默认为电平触发行为
EPOLLONESHOT 设置单发行为。撤消一个事件后,内部将禁用 fd
EPOLLRDNORM 相当于EPOLLIN
EPOLLRDBAND 可以读取优先数据带。
EPOLLWRNORM 相当于EPOLLOUT
EPOLLWRBAND 可以写入优先级数据。
EPOLLMSG Ignored.

Note

注册已注册的文件 Descriptors 会引发 IOError –与Polling Objects的注册相反。

16.1.2. 轮询对象

大多数 Unix 系统上支持的poll()系统调用为同时服务于许多 Client 端的 Web Service 器提供了更好的可伸缩性。 poll()具有更好的伸缩性,因为系统调用仅需要列出感兴趣的文件 Descriptors,而select()则构建位图,为感兴趣的 fds 打开位,然后再重新线性扫描整个位图。 select()是 O(最高文件 Descriptors),而poll()是 O(最高文件 Descriptors 数量)。

Constant Meaning
POLLIN 有要读取的数据
POLLPRI 有紧急数据需要阅读
POLLOUT 准备输出:写不会阻塞
POLLERR 某种错误情况
POLLHUP Hung up
POLLNVAL 无效的请求:Descriptors 未打开

注册已经注册的文件 Descriptors 不是错误,并且与只注册一次 Descriptors 具有相同的效果。

2.6 版的新Function。

try删除从未注册的文件 Descriptors 会引发KeyError异常。

16.1.3. 队列对象

16.1.4. Kevent 对象

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

Constant Meaning
KQ_FILTER_READ 获取 Descriptors 并在有数据可读取时返回
KQ_FILTER_WRITE 获取 Descriptors 并在有数据可写时返回
KQ_FILTER_AIO AIO requests
KQ_FILTER_VNODE 返回在* fflag *中监视的一个或多个请求事件发生时返回
KQ_FILTER_PROC 监视进程 ID 上的事件
KQ_FILTER_NETDEV 监视网络设备上的事件[在 Mac OS X 上不可用]
KQ_FILTER_SIGNAL 每当将观察到的 signal 传递到流程时返回
KQ_FILTER_TIMER 构建一个任意计时器
Constant Meaning
KQ_EV_ADD 添加或修改事件
KQ_EV_DELETE 从队列中删除事件
KQ_EV_ENABLE Permitscontrol()返回事件
KQ_EV_DISABLE Disablesevent
KQ_EV_ONESHOT 首次发生后删除事件
KQ_EV_CLEAR 检索事件后重置状态
KQ_EV_SYSFLAGS internal event
KQ_EV_FLAG1 internal event
KQ_EV_EOF 过滤特定的 EOF 条件
KQ_EV_ERROR 查看返回值

KQ_FILTER_READKQ_FILTER_WRITE过滤器标志:

Constant Meaning
KQ_NOTE_LOWAT 套接字缓冲区的低水位线

KQ_FILTER_VNODE个过滤器标志:

Constant Meaning
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个过滤器标志:

Constant Meaning
KQ_NOTE_EXIT 该过程已退出
KQ_NOTE_FORK 该过程已调用* fork()*
KQ_NOTE_EXEC 该流程执行了一个新流程
KQ_NOTE_PCTRLMASK 内部过滤器标志
KQ_NOTE_PDATAMASK 内部过滤器标志
KQ_NOTE_TRACK 遵循跨* fork()*的过程
KQ_NOTE_CHILD 在子进程上返回* NOTE_TRACK *
KQ_NOTE_TRACKERR 无法依恋孩子

KQ_FILTER_NETDEV过滤器标志(在 Mac OS X 上不可用):

Constant Meaning
KQ_NOTE_LINKUP 链接已构建
KQ_NOTE_LINKDOWN 链接已断开
KQ_NOTE_LINKINV 链接状态无效
首页