走马观花http库2

HeaderMap是http库里用来处理协议头的结构, 本质上是一个哈希表, 解决哈希冲突的策略是开放地址, 地址探测采用的是robin hood. 因为是专用于http头的场景, 还具有键不区分字母大小写, 一个键可以对于多个值, 可以在快速哈希和安全哈希间切换等特点.

走马观花http库1

http库是用Rust编写的一个http基础库, 实现了Request, Response, Method等数据结构. hyper是基于http库的, 而目前Rust的绝大多数web框架都基于hyper, 所以http库几乎是http协议在Rust中的"标准实现".

从redis源码讲事件循环

redis是用C实现的, 事件循环部分简洁而优雅, 代码也紧凑而独立, 不仅能比较流畅地阅读, 而且能很方便地引用到项目中, 压测工具wrk就使用了这部分代码. 下面我们就开始介绍redis中事件循环的实现.

译文: Go是怎么处理栈的

这是一篇翻译文章, 原文是How Stacks are Handled in Go(by Daniel Morsing). 这篇文章向我们介绍了Go解决协程栈增长问题的两种方式和他们的优缺点, 可以帮助我们了解异步模型中有栈还是无栈(Rust的Future是无栈)的考虑出发点.

Rust异步4: Pin和自指类型

在前面介绍Future模式的文章里, 简单讲了下poll方法里的入参Pin类型, 引入Pin是为了解决自指类型的问题, "固定"Future在内存中的位置. 这篇文章就来介绍自指类型是什么, 和Future有什么关系以及Pin是如何解决问题的这些内容.

Rust异步3: async/await语法

上一篇Future模型中介绍了Future模式是如何工作的, 我们开发异步程序时只要实现Future, 然后交给runtime去推动就可以了. 虽然状态机实现的Future, 具有内存占用少, 执行效率高等优点, 但也存在一些问题, 比如:

  1. 异步代码要考虑让出和继续, 和同步代码的线性编程方式很不同
  2. 状态机的执行依赖于状态的变更, 程序越复杂, 状态维护越困难
  3. 需要经常和生命周期, Pin等晦涩的概念打交道, 编程门槛不低

为了缓解Future模式带来的复杂性, 也为了能和同步编程有相似的体验, Rust提供了async和await关键字, 下面我们就来看看这两个语法糖具体做了什么.