向后移植、耐用且可移植的选择器
项目描述
Selectors2
向后移植、耐用且可移植的选择器,设计用于替换标准库中的selectors模块。
功能
支持所有主要平台。(Linux,Mac OS,Windows)
支持Python 2.6或更高版本以及Jython。
- 支持许多不同的选择器
select.kqueue(BSD,Mac OS)
select.devpoll(Solaris)
select.epoll(Linux 2.5.44+)
select.poll(Linux,Mac OS)
select.select - (Linux,Mac OS,Windows)
支持PEP 475(在中断时重试系统调用)
支持在导入后对标准库进行猴子补丁的模块(如greenlet,gevent)
支持定义了选择器但实际未实现其功能的系统。
关于
此模块最初是为urllib3项目(在PR #1001中的历史)编写的,但决定让每个人都有权访问这项工作。
所有由 selectors2 提供的附加功能都是在其维护和使用过程中,在 urllib3 的生命周期中发生并报告的实际问题。
如果这项工作对您有帮助,请随时表示感谢,只需花一点点时间,就能让我的一天变得非常愉快!:蛋糕
这个模块能否替代 selectors 使用?
是的!这个模块是 selectors 的 1:1 直接替换,并提供所有在 selectors 中可用的选择器类型,包括 DevpollSelector、KqueueSelector、EpollSelector、PollSelector 和 SelectSelector。
selectors2 和 selectors34 之间有什么不同?
该模块与 selectors34 类似,它支持 Python 2.6 - 3.3,但不同之处在于,此模块还实现了对回传选择器的 PEP 475。这允许 Python 3.5+ 选择器和 PEP 475 之前的选择器具有相似的行为。在 selectors34 中,中断的系统调用会导致没有事件的错误返回,这对于某些用例来说是不可接受的行为。
我还要补充一点,selectors2 还对其周围的测试套件进行了大幅改进,为每个选择器提供了 100% 的测试覆盖率。测试套件也更健壮,测试了在 selectors34 中未测试的许多不同情况下选择器的持久性。
支持哪些类型的对象?
目前,selectors2 仅支持 Windows 上的 SelectSelector,无法选择非套接字对象。在 Linux 和 Mac OS 上,支持套接字和管道(还可能支持其他类型,例如 fifo 或特殊文件设备)。
如果必须支持没有 select.select 的平台怎么办?
有一些平台没有提供选择器,特别是 Google AppEngine。在这些平台上运行时,任何对 DefaultSelector() 的调用都会引发一个 RuntimeError,解释说没有提供选择器。
许可
此模块同时受 MIT 和 PSF 许可协议的约束。
安装
$ python -m pip install selectors2
用法
import sys
import selectors2 as selectors
# Use DefaultSelector, it picks the best
# selector available for your platform! :)
s = selectors.DefaultSelector()
import socket
# We're going to use Google as an example.
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("www.google.com", 80))
# Register the file to be watched for write availibility.
s.register(sock, selectors.EVENT_WRITE)
# Give a timeout in seconds or no
# timeout to block until an event happens.
events = s.select(timeout=1.0)
# Loop over all events that happened.
for key, event in events:
if event & selectors.EVENT_WRITE:
key.fileobj.send(b'HEAD / HTTP/1.1\r\n\r\n')
# Change what event you're waiting for.
s.modify(sock, selectors.EVENT_READ)
# Timeout of None let's the selector wait as long as it needs to.
events = s.select(timeout=None)
for key, event in events:
if event & selectors.EVENT_READ:
data = key.fileobj.recv(4096)
print(data)
# Stop watching the socket.
s.unregister(sock)
sock.close()
变更日志
版本 2.0.2(2020 年 7 月 21 日)
[修复错误] 在 Python 2.x 中添加了对长整数的支持。
版本 2.0.1(2017 年 8 月 17 日)
[修复错误] 接收到 EINTR 错误后,超时不会被正确地重新计算。
版本 2.0.0(2017 年 5 月 30 日)
[新增功能] 添加了对 Jython 的支持,包括 JythonSelectSelector。
[新增功能] 添加了对 /dev/devpoll 的支持,包括 DevpollSelector。
[变更] 如果没有选择器可用,则引发 RuntimeError 而不是 ValueError。
[变更] 不再将异常包装在 SelectorError 中,包括在超时情况下,直接引发原始异常。
[修复错误] 可以检测到定义了选择器但没有实现它的系统的缺陷。
[修复错误] 现在可以检测导入 selectors2 之后 select 模块的变化,例如在调用 gevent.monkey.monkey_patch() 之前导入 selectors2。
版本 1.1.1(2017 年 2 月 6 日)
[修复错误] 定义了 select.kqueue 的平台不会有 KqueueSelector 作为 DefaultSelector。
版本 1.1.0(2017 年 1 月 17 日)
[特性] 为支持PEP 475的Python版本优化系统调用速度。
[特性] 轮子现在为通用。
版本 1.0.0(2016年11月3日)
selectors2 的初始实现。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。