http/2优先级树的纯python实现
priorit的Python项目详细描述
优先级:http/2优先级实现
priority是http/2优先级逻辑的纯python实现,set 在RFC 7540第5.3节(流优先级)中。这个逻辑允许客户端 表示服务器如何将其(有限的)资源分配给 可能在单个http/2上运行的许多未完成的http请求 连接。
具体来说,这个python实现使用了实现的一个变体 用于卓越的水项目。这个原始实现也是 对优先权实现的灵感,通常产生 非常干净,甚至优先流。水的唯一显著变化 实现是允许优先级实现 作为单独的实现干净地工作,而不是嵌入到 直接堆叠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。
这看起来像这样:
>>>forstream_idinp:...send_data(stream_id)
如果每个流仅在被此机制"取消连接"时发送,则服务器 将自动发出符合RFC 7540的流数据。
更新树
如果由于任何原因流无法继续(例如,它在 http/2流控制,或者它正在等待来自另一个服务的更多数据)。 流被阻塞。应该通知优先级树 阻塞以便其他依赖流有机会继续。这可以 通过调用流id为 当前无法继续。这将自动更新树,并且 将动态调整以正确允许依赖于 被阻止的进程。
例如:
>>>forstream_idinp:...send_data(stream_id)...ifblocked(stream_id):...p.block(stream_id)
当流从被阻塞变为被解除阻塞时,调用 unblock 方法将其放回序列中。 阻塞和 解除阻塞 方法是等幂的,可以安全地重复调用。
另外,流的优先级可以改变。当它发生时, 重新排定优先级 方法可用于更新之后的树 改变。 重新排序 与插入流具有相同的签名,但是 仅适用于树中已存在的流。
删除流
可以通过调用remove-stream从树中完全删除流。 注意,这不是等幂的。此外,调用 remove_stream 然后 重新添加它可能会导致优先级的形状发生重大变化 树, 将导致迭代要更改的离子顺序。
许可证
根据麻省理工学院的许可证,优先权是可用的。有关详细信息,请参见 存储库中的许可证文件。
作者
优先权由Cory Benfield保持,其他人也有贡献。为了 有关贡献者的详细信息,请参见 存储库。