首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

select

该模块提供了访问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)对象

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对象

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

用户定义的值。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com