select等待I / O完成 – 网络和进程间通信(Python教程)(参考资料)
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已被弃用并完全被忽略。但是,供货时,其值必须是
0
或select.EPOLL_CLOEXEC
,否则OSError
is//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
,POLLPRI
和POLLOUT
.的组合警告
注册已注册的文件描述符不是错误的,但结果是未定义的。适当的操作是注册或首先修改它。与
poll()
.
devpoll.
modify
(fd [, eventmask] )相比,这是一个重要的区别- 这个方法做了
unregister()
然后是register()
。明显地做同样的(有点)效率更高.
devpoll.
unregister
(fd)- 删除由轮询对象跟踪的文件描述符。就像
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.
unregister
(fd)- 从epoll对象中删除已注册的文件描述符.
epoll.
poll
(timeout=-1, 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()
,所以它们也可以用作参数.eventmask是一个可选的位掩码,描述了你要检查的事件类型,可以是常量
POLLIN
,POLLPRI
和POLLOUT
,如下表所述。如果没有指定,使用的默认值将检查所有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对象的可迭代或
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_READ
和KQ_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_PROC
filter 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
- 用户定义的值