跳转到主要内容

向后移植、耐用且可移植的选择器

项目描述

Selectors2

https://img.shields.io/travis/SethMichaelLarson/selectors2/master.svg?style=flat-square https://img.shields.io/appveyor/ci/SethMichaelLarson/selectors2/master.svg?style=flat-square https://img.shields.io/pypi/v/selectors2.svg?style=flat-square https://img.shields.io/badge/say-thanks-ff69b4.svg?style=flat-square

向后移植、耐用且可移植的选择器,设计用于替换标准库中的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 中可用的选择器类型,包括 DevpollSelectorKqueueSelectorEpollSelectorPollSelectorSelectSelector

selectors2selectors34 之间有什么不同?

该模块与 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 的初始实现。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

selectors2-2.0.2.tar.gz (18.6 kB 查看哈希值)

上传时间 源代码

构建发行版

selectors2-2.0.2-py2.py3-none-any.whl (11.3 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下组织支持