美文网首页rust语言
理解 rust 中的 futures (一)

理解 rust 中的 futures (一)

作者: 西门早柿 | 来源:发表于2021-02-16 21:17 被阅读0次

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

    相关文章

      网友评论

        本文标题:理解 rust 中的 futures (一)

        本文链接:https://www.haomeiwen.com/subject/jhrwxltx.html