select
– 等待一组流上的事件¶
This module implements a subset of the corresponding CPython module,
as described below. For more information, refer to the original
CPython documentation: select
。
该模块提供了一组函数,用于有效地等待多个 streams (已准备好进行操作的选择流)上的事件。
函数¶
- select.poll()¶
创建一个Poll类的实例。
- select.select(rlist, wlist, xlist[, timeout])¶
等待一组对象上的活动。
此函数由某些MicroPython移植版本提供以确保兼容性,但效率不高。建议使用
Poll
。
类 Poll
¶
方法¶
- poll.register(obj[, eventmask])¶
将 streams obj 注册到轮询中。eventmask 是以下值的逻辑或:
select.POLLIN
- 可读数据select.POLLOUT
- 可写入更多数据
请注意,像
select.POLLHUP
和select.POLLERR
这样的标志作为输入事件掩码不是有效的(这些是不被请求的事件,无论是否请求,都将从poll()
返回)。这一语义符合POSIX标准。eventmask 默认为
select.POLLIN | select.POLLOUT
。可以多次调用此函数以对同一 obj 进行注册。连续调用将更新 obj 的事件掩码为 eventmask 的值(即将表现为
modify()
)。
- poll.unregister(obj)¶
将 obj 从轮询中注销。
- poll.poll(timeout=-1, /)¶
等待至少一个已注册对象变为就绪或出现异常情况,可选择指定毫秒级超时(如果未指定 timeout 参数或为-1,则没有超时)。
返回 (
obj
,event
, …) 元组列表。元组中可能还有其他元素,这取决于平台和版本,因此不要假设其大小为2。event
元素指定流发生了哪些事件,并且是上述select.POLL*
常量的组合。请注意,标志select.POLLHUP
和select.POLLERR
可以随时返回(即使没有被请求),必须相应地进行处理(从轮询中注销相应的流并可能关闭),因为否则所有后续对poll()
的调用可能会立即返回,并再次设置这些流的标志。在超时情况下,返回一个空列表。
与CPython的不同之处
如上所述,返回的元组可能包含2个以上元素。
- poll.ipoll(timeout=-1, flags=0, /)¶
类似于
poll.poll()
,但返回一个迭代器,该迭代器生成callee-owned tuple
。此函数提供了一种有效的,无分配的方式来轮询流。如果 flags 为1,则采用一次性行为以处理事件:发生事件的流将自动重置其事件掩码(相当于
poll.modify(obj, 0)
),因此对于这样的流,新事件将不会被处理,直到使用poll.modify()
设置了新的掩码。这种行为对于异步I/O调度器非常有用。与CPython的不同之处
此函数是MicroPython 的扩展。