HTTP/2优先级树的纯Python实现
项目描述
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方法将其放回序列。block和unblock方法都是幂等的,可以安全地重复调用。
此外,流的优先级可能会改变。当它发生变化时,可以使用reprioritize方法在变化之后更新树。reprioritize与insert_stream具有相同的签名,但仅适用于已存在于树中的流。
移除流
可以通过调用remove_stream将流完全从树中移除。请注意,这不是幂等的。此外,调用remove_stream然后重新添加它可能会对优先级树的形状产生重大变化,并且将导致迭代顺序发生变化。
许可协议
优先级在MIT许可下提供。有关更多详细信息,请参阅存储库中的LICENSE文件。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
priority-2.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0 |
|
MD5 | 149531bf0e754782cf218bfc8cc994ae |
|
BLAKE2b-256 | f53ceb7c35f4dcede96fca1842dac5f4f5d15511aa4b52f3a961219e68ae9204 |
priority-2.0.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa |
|
MD5 | 4b37219b8468723cfe978a541b941a7b |
|
BLAKE2b-256 | 5e5f82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790 |