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是一个可选位掩码描述要检查事件的类型,可以是常量的组合POLLINPOLLPRIPOLLOUT在如下表所述。如果未指定,则使用的默认值将检查所有3种类型的事件。

不变含义
POLLIN有数据需要阅读
POLLPRI有紧急的数据要阅读
POLLOUT准备输出:写入不会被阻止
POLLERR某种错误情况
POLLHUP挂了
POLLNVAL无效的请求:描述符未打开

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

poll.modify(fd, eventmask)

修改已经注册的fd。这与之相同register(fd, eventmask)。尝试修改从未注册的文件描述符会导致引发IOErrorerrno异常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_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_ENABLEPermitscontrol()返回事件
KQ_EV_DISABLEDisablesevent
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_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该过程称为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

用户定义的值。