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保持,其他人也有贡献。为了 有关贡献者的详细信息,请参见 存储库。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
IE中的java跨域cookie问题   重复java中已经满足的循环   编译java RMI服务器时出错   JavaServlet POST中作为参数传递的javascript大型JSON数组数据为空   java片段未每次刷新/调用   java无法编译。错误消息   java如何构造大型类?   java Hibernate:TableThingsDB。事情并不存在   java如何操作从匹配项创建的数组。发现   循环以搜索和显示数组Java的某些部分   加载或注册SQLite JDBC驱动程序时出现java问题   活动和服务之间的java连接   JavaGWTG2D:ie8中的drawImage   java在安卓中设置hessian阈值   在Tomcat中使用Logback时发生java错误