select– 等待I / O完成


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

selectors模块允许基于select模块原语构建的高级高效I / O。鼓励用户使用selectors而不是模块,除非他们想要精确控制所使用的操作系统级原语.

该模块定义如下:

exception select.error
一个弃用的别名OSError.

改版3.3:以下PEP 3151 ,这个类是OSError.

select.devpoll
的别名(仅在Solaris和派生词上支持。)返回/dev/poll轮询对象;参见/ dev / poll部分投票对象下面是devpoll对象支持的方法.

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

新文件描述符不可继承.

版本新3.3.

在版本3.4中更改:新的文件描述符现在是不可加载的

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

sizehint通知epoll有关预注册事件的数量。它必须是正面的,或 – 1 使用默认值。它只适用于epoll_create1()不可用;否则它没有效果(虽然它的值仍然被检查).

flags已被弃用并完全被忽略。但是,供货时,其值必须是0select.EPOLL_CLOEXEC,否则OSErroris//ised.

参见边缘和水平触发轮询(epoll)对象以下部分说明物体支持的方法.

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

新的文件描述符是不可继承.

在版本3.3中更改:添加了flags参数

更改版本3.4:支持with语句被添加。新的文件描述符现在是不可继续的.

自版本3.4:后重新编号flags参数。select.EPOLL_CLOEXEC现在默认使用。使用os.set_inheritable()使文件描述符可继承.

select.poll ( )
(不受所有操作系统支持。)返回一个轮询对象,支持注册和取消注册文件描述符,然后轮询它们以进行I / O事件;有关轮询对象支持的方法,请参阅轮询对象.
select.kqueue()
(仅支持BSD。)返回内核队列对象;参见 Kqueue Objects 下面的kqueue对象支持的方法

新文件描述符是不可继承.

在版本3.4中更改:新文件描述符现在不可用.

select.kevent (ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0
(仅支持BSD。)返回内核事件对象;参见 Kevent Objects 下面的kevent对象支持的方法.
select.select (rlist, wlist, xlist [, timeout]
这是Unix select()系统调用的直接接口。前三个参数是’waitable objects‘的序列:表示文件描述符的整数或具有无参数方法名称的对象fileno()返回这样一个整数:

  • rlist:等到准备好读
  • wlist:等到准备好写
  • xlist:等待“异常情况”(参见whatyour的手册页)系统考虑这样的条件)

允许空序列,但接受三个空序列是平台依赖的。(众所周知,它可以在Unix上工作,但不能在Windows上工作。)Theoptional timeout参数指定超时为浮点数秒。当省略timeout参数时,函数会阻止untilat至少一个文件描述符准备就绪。超时值为零指定apoll并且永远不会阻塞.

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

序列中可接受的对象类型是Python fileobjects (例如sys.stdin,或open()os.popen()返回的对象,socket.socket()。您也可以自己定义一个wrapper课程,只要它有适当的fileno()方法(即返回文件描述符,而不仅仅是一个随机整数).

注意

Windows上的文件对象是不可接受的,但是套接字是。在Windows上,底层select()函数由WinSocklibrary提供,不处理不源自WinSock的文件描述符.

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

select.PIPE_BUF
当管道报告为select(),poll()或此模块中的其他接口。这不适用于其他类型的文件对象,如套接字.

这个值由POSIX保证至少为512.

Availability:Unix

版本3.2.

 

/dev/poll轮询对象

Solaris和派生有/dev/poll。当select() isO(最高文件描述符)和poll()是O(文件描述符的数量)时,/dev/poll是O(活动文件描述符).

/dev/poll行为是非常接近标准poll()object.

devpoll.close()
关闭投票对象的文件描述符.

新的版本3.4.

devpoll.closed
True如果投票对象关闭了

新版本3.4.

devpoll.fileno ()
返回档案轮询对象的描述符号.

新版本3.4.

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

eventmask是一个可选的位掩码,用于描述你想要的事件类型。常量与poll()宾语。默认值是常量POLLIN,POLLPRIPOLLOUT.

的组合警告

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

devpoll.modifyfd [, eventmask] )相比,这是一个重要的区别
这个方法做了unregister()然后是register()。明显地做同样的(有点)效率更高.
devpoll.unregisterfd)
删除由轮询对象跟踪的文件描述符。就像register()方法一样,fd可以是整数或带有fileno()方法的对象,它返回一个整数.

尝试删除文件描述符那从未登记过,被忽视了.

devpoll.poll ( [timeout])
填写注册文件描述符的集合,返回包含(fd, event) 2元组的可能为空的列表,用于具有要报告的事件orerrors的描述符。fd是文件描述符,event是为该描述符的报告事件设置的位掩码withbits – POLLIN forwaiting input,POLLOUT表示描述符可以是writtento,依此类推。空列表表示呼叫超时且没有文件描述符有任何要报告的事件。如果给出timeout,则它指定系统在返回之前等待事件的时间长度(以毫秒为单位)。如果省略timeout,-1或None,则调用将阻塞,直到此轮询对象发生事件为止

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

 

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

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

eventmask

Constant Meaning
EPOLLIN 可供读取
EPOLLOUT 可用于写入
EPOLLPRI 用于读取的紧急数据
EPOLLERR 在assoc上发生错误情况。fd
EPOLLHUP 挂断发生在assoc上。FD
EPOLLET 设置边沿触发行为,默认为水平触发行为
EPOLLONESHOT 设置一次性行为。在一个事件被淘汰后,fd被内部禁用
EPOLLEXCLUSIVE 当关联的fd有事件时,只唤醒一个epoll对象。默认(ifthis标志未设置)是唤醒所有epollobjects轮询fd.
EPOLLRDHUP 流套接字对等关闭连接或关闭写入连接的一半.
EPOLLRDNORM 等效于EPOLLIN
EPOLLRDBAND 可以读取优先级数据带
EPOLLWRNORM 等效于EPOLLOUT
EPOLLWRBAND 优先级数据可能写的.
EPOLLMSG 忽略了

新版本3.6:EPOLLEXCLUSIVE添加了。它仅受Linux Kernel 4.5或更高版本的支持.

epoll.close ()
关闭epoll对象的控制文件描述符.
epoll.closed
True如果epoll对象关闭了
epoll.fileno)
返回控件的文件描述符号码
epoll.fromfd// (fd
从给定的文件描述符创建一个epoll对象.
epoll.register (fd [, eventmask]
用epoll对象注册一个fd描述符.
epoll.modify (fd, eventmask)
修改一个注册文件描述符.
epoll.unregisterfd
从epoll对象中删除已注册的文件描述符.
epoll.poll (timeout=-1, maxevents=-1)
等待事件。以秒为单位的超时(浮点数)

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

 

轮询对象

poll()系统调用,在大多数Unix系统上都支持,提供对于同时为许多客户提供服务的网络服务器而言,具有更好的可扩展性。poll()更好地扩展,因为系统调用只需要列出感兴趣的文件描述符,而select()构建一个位图,为感兴趣的fds打开位,然后再对整个位图进行线性扫描。select()是O(最高文件描述符),而poll()是O(文件描述符数).

poll.registerfd [, eventmask]
用轮询对象注册文件描述符。未来打电话给poll()方法将然后检查文件描述符是否有任何未完成的I / O事件。fd可以是整数,也可以是带有fileno()方法的对象,该方法返回一个整数。文件对象实现fileno(),所以它们也可以用作参数.

eventmask是一个可选的位掩码,描述了你要检查的事件类型,可以是常量POLLIN,POLLPRIPOLLOUT,如下表所述。如果没有指定,使用的默认值将检查所有3种类型的事件.

Constant Meaning
POLLIN 有数据可读
POLLPRI 有紧急情况要读取的数据
POLLOUT 准备输出:写不会阻塞
POLLERR 某种错误状况
POLLHUP 挂了
POLLRDHUP 流套接字对等关闭连接,orshut向下写入连接的一半
POLLNVAL 请求无效:描述符未打开

注册已注册的文件描述符不是错误,与注册描述符的效果相同.

poll.modify(fd, eventmask)
修改已注册的fd。这与register(fd, eventmask)具有相同的效果。试图修改一个从未注册过的文件描述会导致OSError异常,并且会引发错误ENOENT .
poll.unregister(fd
删除轮询对象跟踪的文件描述符。就像register()方法一样,fd可以是一个整数或一个带有fileno()方法的对象,它返回一个整数.

试图删除一个从未注册的文件描述符会导致KeyError异常被提出.

poll.poll ( [timeout]
轮询一组已注册的文件描述符,并为包含事件orerrors的描述符返回一个包含(fd, event) 2元组的可能空列表。fd是文件描述符,event是为该描述符的报告事件设置的位掩码forbits – POLLIN forwaiting input,POLLOUT表示描述符可以是writtento,依此类推。空列表表示呼叫超时且没有文件描述符有任何要报告的事件。如果timeout给出,它指定系统在返回之前等待事件的时间长度(以毫秒为单位)。如果timeout被省略,否定或None,则调用将阻塞,直到此轮询对象发生事件为止.

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

 

Kqueue Objects

kqueue.close
关闭kqueue对象的控制文件描述符.
kqueue.closed
True如果kqueue对象关闭了
kqueue.fileno
返回控件的文件描述符号fd.
kqueue.fromfd (fd)
创建一个kqueue来自给定文件描述符的对象.
kqueue.control (changelist, max_events [, timeout=None])→eventlist
低kevent

  • 更改列表的级别接口必须是kevent对象的可迭代或None
  • max_events必须为0或正整数
  • 超时秒数(可能浮动)

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

 

Kevent Objects

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

kevent.ident
用于识别事件的值。解释取决于过滤器,但它通常是文件描述符。在构造函数中,ident可以是int或具有fileno()方法的对象。keventstores整数内部.
kevent.filter
内核过滤器的名称.

Constant Meaning
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 在检索到事件后重置状态
KQ_EV_SYSFLAGS 内部事件
KQ_EV_FLAG1 内部事件
KQ_EV_EOF 特定于过滤器EOF条件
KQ_EV_ERROR 参见返回值
kevent.fflags
过滤特定的标志.

KQ_FILTER_READKQ_FILTER_WRITE过滤标志:

常数 含义
KQ_NOTE_LOWAT 低套接字缓冲区的水印

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_PROCfilter flags:

常量 含义
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
用户定义的值