select
select — Waiting for I/O completion
该模块提供了访问select()
和poll()
可用的功能在大多数操作系统,epoll()
在Linux 2.5+可用,kqueue()
适用于大部分BSD。请注意,在Windows上,它只适用于套接字; 在其他操作系统上,它也适用于其他文件类型(特别是在Unix上,它在管道上工作)。它不能用于常规文件,以确定自上次读取文件后文件是否已增长。
该模块定义了以下内容:
exception select.error
发生错误时引发异常。附带的值是一对包含数字错误代码的对errno
和相应的字符串,将由C函数打印perror()
。
select.epoll([sizehint=-1])
(仅在Linux 2.5.44及更新版本上受支持。)返回边缘轮询对象,可用作I / O事件的边缘或层次触发接口; 请参见下面的边缘和级别触发器轮询(epoll)对象部分,了解对象支持的方法。
2.6版本中的新功能。
select.poll()
(不受所有操作系统支持。)返回一个轮询对象,该对象支持注册和取消注册文件描述符,然后轮询它们以查找I / O事件; 有关轮询对象支持的方法,请参见下面的轮询对象部分。
select.kqueue()
(仅在BSD上支持。)返回一个内核队列对象; 有关kqueue对象支持的方法,请参见下面的Kqueue Objects部分。
2.6版本中的新功能。
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)
(仅在BSD上支持。)返回内核事件对象; 有关kevent对象支持的方法,请参见下面的Kevent对象部分。
2.6版本中的新功能。
select.select(rlist, wlist, xlist[, timeout])
这是Unix select()
系统调用的直接接口。前三个参数是“可等待对象”的序列:表示文件描述符的整数或带有无参数方法的对象,fileno()
返回这样一个整数:
rlist
:等到准备好阅读
wlist
:等到准备写作
xlist
:等待“异常情况”(请参阅手册页,了解您的系统考虑的这种情况)
空序列是允许的,但三个空序列的接受是平台相关的。(已知在Unix上工作,但在Windows上工作。)可选的超时
参数指定超时
为浮点数,以秒为单位。当省略超时
参数时,该功能将阻塞,直到至少有一个文件描述符就绪。超时
值为零指定轮询并且永不阻止。
返回值是准备好的对象列表的三倍:前三个参数的子集。如果在没有文件描述符准备就绪的情况下达到超时,则返回三个空列表。
间序列中的可接受的对象类型(例如Python的文件对象sys.stdin
通过返回,或物体open()
或os.popen()
)中,由返回的插座对象socket.socket()
。你也可以自己定义一个包装
类,只要它有一个合适的fileno()
方法(它真的返回一个文件描述符,而不仅仅是一个随机整数)。
注意
Windows上的文件对象不可接受,但套接字是。在Windows上,底层select()
函数由WinSock库提供,并且不处理源自WinSock的文件描述符。
select.PIPE_BUF
文件报告准备好写的select()
,poll()
或者在该模块中类似的接口,保证不可达写入块PIPE_BUF
字节。这个值由POSIX保证至少为512.可用性:Unix。
New in version 2.7.
1.边缘和水平触发轮询(epoll)对象
http://linux.die.net/man/4/epoll
eventmask
不变 | 含义 |
---|---|
EPOLLIN | 可供阅读 |
EPOLLOUT | 可用于写入 |
EPOLLPRI | 用于读取的紧急数据 |
EPOLLERR | 在assoc上发生错误情况。FD |
EPOLLHUP | 挂起发生在assoc上。FD |
EPOLLET | 设置Edge Trigger行为,默认是Level Trigger行为 |
EPOLLONESHOT | 设置一次性行为。在一个事件被拉出后,fd在内部被禁用 |
EPOLLRDNORM | 相当于EPOLLIN |
EPOLLRDBAND | 优先数据带可以被读取。 |
EPOLLWRNORM | 相当于EPOLLOUT |
EPOLLWRBAND | 可以写入优先数据。 |
EPOLLMSG | 忽略。 |
epoll.close()
关闭epoll对象的控制文件描述符。
epoll.fileno()
返回控制fd的文件描述符编号。
epoll.fromfd(fd)
从给定的文件描述符创建一个epoll对象。
epoll.register(fd[, eventmask])
用epoll对象注册一个fd描述符。
注意
注册已经注册的文件描述符会引发IOError - 与Polling Objects的注册表相反。
epoll.modify(fd, eventmask)
修改寄存器文件描述符。
epoll.unregister(fd)
从epoll对象中删除已注册的文件描述符。
epoll.poll([timeout=-1[, maxevents=-1]])
等待事件。超时秒数(浮点数)
2.轮询对象
poll()
大多数Unix系统支持的系统调用为同时为多个客户提供服务的网络服务器提供了更好的可扩展性。poll()
缩放比较好,因为系统调用只需要列出感兴趣的文件描述符,同时select()
构建位图,为感兴趣的fds打开位,然后必须再次线性扫描整个位图。select()
是O(最高文件描述符),而poll()
O(文件描述符的数量)。
poll.register(fd[, eventmask])
使用轮询对象注册文件描述符。未来对该poll()
方法的调用将检查文件描述符是否有任何挂起的I / O事件。fd
可以是一个整数,也可以是一个带有fileno()
返回整数的方法的对象。文件对象实现fileno()
,所以它们也可以用作参数。
eventmask
是一个可选位掩码描述要检查事件的类型,可以是常量的组合POLLIN
,POLLPRI
和POLLOUT
在如下表所述。如果未指定,则使用的默认值将检查所有3种类型的事件。
不变 | 含义 |
---|---|
POLLIN | 有数据需要阅读 |
POLLPRI | 有紧急的数据要阅读 |
POLLOUT | 准备输出:写入不会被阻止 |
POLLERR | 某种错误情况 |
POLLHUP | 挂了 |
POLLNVAL | 无效的请求:描述符未打开 |
注册已经注册的文件描述符并不是错误,并且具有与仅仅注册一次描述符相同的效果。
poll.modify(fd, eventmask)
修改已经注册的fd。这与之相同register(fd, eventmask)
。尝试修改从未注册的文件描述符会导致引发IOError
errno异常ENOENT
。
2.6版本中的新功能。
poll.unregister(fd)
删除正在由轮询对象跟踪的文件描述符。就像这个register()
方法一样,fd
可以是一个整数或一个带有fileno()
返回整数的方法的对象。
试图删除从未注册的文件描述符会导致引发KeyError
异常。
poll.poll([timeout])
轮询注册文件描述符的集合,并返回包含(fd, event)
2元组的可能为空的列表,以便为要报告的事件
或错误描述符。fd
是文件描述符,事件
是一个位掩码,为该描述符的报告事件
设置位 - POLLIN
用于等待输入,POLLOUT
指示描述符可以写入,等等。一个空列表表示该呼叫超时
,并且没有文件描述符有任何要报告的事件
。如果给出超时
,它指定系统在返回之前等待事件
的时间长度(以毫秒为单位)。如果超时
被忽略,否定,或者None
,该调用将被阻塞,直到该轮询对象发生事件
。
3. Kqueue对象
kqueue.close()
关闭kqueue对象的控制文件描述符。
kqueue.fileno()
返回控制fd的文件描述符编号。
kqueue.fromfd(fd)
从给定的文件描述符创建一个kqueue对象。
kqueue.control(changelist, max_events[, timeout=None]) → eventlist
Low level interface to kevent
- changelist必须是kevent对象或者可迭代的对象
None
- max_events必须是0或正整数
- 以秒为单位的超时时间
4. Kevent对象
https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
kevent.ident
用于识别事件的值。解释取决于过滤器,但通常是文件描述符。在构造函数中,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 | Permitscontrol()返回事件 |
KQ_EV_DISABLE | Disablesevent |
KQ_EV_ONESHOT | 第一次发生后删除事件 |
KQ_EV_CLEAR | 检索事件后重置状态 |
KQEVSYSFLAGS | 内部事件 |
KQEVFLAG1 | 内部事件 |
KQ_EV_EOF | 过滤特定的EOF状况 |
KQ_EV_ERROR | 查看返回值 |
kevent.fflags
过滤特定的标志。
KQ_FILTER_READ
and KQ_FILTER_WRITE
filter flags:
不变 | 含义 |
---|---|
KQ_NOTE_LOWAT | 套接字缓冲区的低水印 |
KQ_FILTER_VNODE
filter flags:
不变 | 含义 |
---|---|
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 | 该过程称为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上不可用):
不变 | 含义 |
---|---|
KQ_NOTE_LINKUP | 链接已启动 |
KQ_NOTE_LINKDOWN | 链接已关闭 |
KQ_NOTE_LINKINV | 链接状态无效 |
kevent.data
过滤特定的数据。
kevent.udata
用户定义的值。