这篇文章是 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)));
}
网友评论