跳转到主要内容

HTTP/2优先级树的纯Python实现

项目描述

Build Status Code Coverage Documentation Status Chat community https://raw.github.com/python-hyper/documentation/master/source/logo/hyper-black-bg-white.png

Priority是一个纯Python实现,用于HTTP/2的优先级逻辑,如RFC 7540第5.3节(流优先级)中所述。这种逻辑允许客户端表达对服务器如何分配其(有限的)资源以处理在单个HTTP/2连接上运行的多项HTTP请求的偏好。

具体来说,这个Python实现使用了在优秀的H2O项目中使用的实现的一个变体。这个原始实现也是nghttp2的优先级实现的灵感来源,通常会产生一个非常干净且均匀的优先级流。与H2O实现相比,唯一的显著变化是对优先级实现的微小修改,允许其作为一个单独的实现干净地工作,而不是直接嵌入到HTTP/2堆栈中。

尽管HTTP/2中的优先级信息只是一个建议,而不是一个可执行的约束,但服务器应尽可能尊重其客户端的优先级请求。

使用优先级

优先级有一个简单的API。流被插入到树中:当它们被插入时,它们可以可选地具有一个权重,依赖于另一个流,或成为另一个流的独家依赖。

>>> p = priority.PriorityTree()
>>> p.insert_stream(stream_id=1)
>>> p.insert_stream(stream_id=3)
>>> p.insert_stream(stream_id=5, depends_on=1)
>>> p.insert_stream(stream_id=7, weight=32)
>>> p.insert_stream(stream_id=9, depends_on=7, weight=8)
>>> p.insert_stream(stream_id=11, depends_on=7, exclusive=True)

一旦流被插入,就可以请求流优先级。这允许服务器做出关于如何分配资源的决策。

遍历树

这个算法中的树充当一个门。它的目标是允许一次通过一个流,以尽可能均匀地按比例服务于所有活跃流的方式。

这是通过遍历树来处理的。树本身是一个迭代器,每次前进时都会产生一个流ID。这是下一个应该发送数据的流的ID。

这看起来是这样的

>>> for stream_id in p:
...     send_data(stream_id)

如果每个流只在通过这个机制“解除限制”时发送,服务器将自动按照RFC 7540的规定发送流数据。

更新树

如果由于任何原因,一个流无法继续进行(例如,它在HTTP/2流量控制中被阻塞,或者它正在等待来自另一个服务的数据),则该流被阻塞。应该通知PriorityTree该流被阻塞,以便其他依赖流有机会继续。可以通过调用树上的block方法并传入当前无法继续的流ID来完成此操作。这将自动更新树,并且它会实时调整,以正确允许任何依赖于被阻塞流的流继续。

例如

>>> for stream_id in p:
...     send_data(stream_id)
...     if blocked(stream_id):
...         p.block(stream_id)

当流从被阻塞变为未被阻塞时,调用unblock方法将其放回序列。blockunblock方法都是幂等的,可以安全地重复调用。

此外,流的优先级可能会改变。当它发生变化时,可以使用reprioritize方法在变化之后更新树。reprioritizeinsert_stream具有相同的签名,但仅适用于已存在于树中的流。

移除流

可以通过调用remove_stream将流完全从树中移除。请注意,这不是幂等的。此外,调用remove_stream然后重新添加它可能会对优先级树的形状产生重大变化,并且将导致迭代顺序发生变化。

许可协议

优先级在MIT许可下提供。有关更多详细信息,请参阅存储库中的LICENSE文件。

作者

优先级由Cory Benfield维护,其他人也有贡献。有关贡献者的更多详细信息,请参阅存储库中的CONTRIBUTORS.rst。

项目详情


下载文件

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

源分布

priority-2.0.0.tar.gz (24.8 kB 查看哈希值)

上传时间

构建分布

priority-2.0.0-py3-none-any.whl (8.9 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面