专栏名称: 西门早柿
目录
相关文章推荐
今天看啥  ›  专栏  ›  西门早柿

理解 rust 中的 futures (一)

西门早柿  · 简书  ·  · 2021-02-17 21:17

这篇文章是 Understanding futures in Rust 的翻译。原文一共有上下两篇。

前言

Futures 使得 Rust 中的异步编程变得更加容易和可理解。本文通过从头构建 futures,来学习如何使用 futures。

背景

Rust 中的 futures 有点类似于 JavaScript 中的 promises 。它是构建在 Rust 现有并发原语之上的强大抽象。它也是通向 async/await 的踏脚石,使得用户可以使用同步代码的方式编写异步程序。

Async/await 在早版本的 Rust 中并不完善,但现在你已经没有理由不在项目中开始使用 futures 了。 tokio 是一个稳定的、易用的、高性能的 Rust crate*。

现在 futures 已经是 Rust 标准库中的一部分了,但在这个系列的博客中,我将从头实现一个简化版本的 futures 库,用来展示它是如何工作和使用的,同时展示如何避免一些常见的陷阱**。

  • Tokio master 分支使用了 std::futures。

  • 尽量 futures 已经是标准库的一部分,但缺乏很多常用的 futures。目前这些常用的 futures 在 futures-preview 维护,本文参考了其中的一些 function 和 traits 定义。

需要准备的

  • 少量的 Rust 知识,或者学习的意愿(推荐阅读 Rust book ,它很棒!)。
  • 一个现代浏览器(我们将会用到 rust playground )。

目标

下面的代码对标准库中的 futures 库是语法上有效的,展示了如何使用 futures 级连工作。本博客的目标就是能够理解这段代码,实现相关的类型和函数,使其可以编译。

// This does not compile, yet

fn main() {
    let future1 = future::ok::<u32, u32>(1)
        .map(|x| x + 3)
        .map_err(|e| println!("Error: {:?}", e))
        .and_then(|x| Ok(x - 3))
        .then(|res| {
          match res {
              Ok(val) => Ok(val + 3),
              err => err,
          }
        });
    let joined_future = future::join(future1, future::err::<u32, u32>(2));
    let val = block_on(joined_future);
    assert_eq!(val, (Ok(4), Err(2)));
}



原文地址:访问原文地址
快照地址: 访问文章快照