美文网首页RUST编程
007 Rust 异步编程,通过 join 执行 Future

007 Rust 异步编程,通过 join 执行 Future

作者: 令狐壹冲 | 来源:发表于2020-07-14 21:15 被阅读0次

前言

在之前我们主要介绍了通过await和block_on执行Future,但是这两种方式实际上都是顺序执行的方式。

.await是在代码块中按顺序执行,会阻塞后面的代码,但是此时会让出线程;block_on会阻塞直到Future执行完成。

本节我们介绍join宏,可以同时执行多个Future。

join宏

join宏允许在同时执行多个不同的Future并等待它们完成。

示例

  • 源码
//src/main.rs
use futures;
use tokio::runtime::Runtime;

async fn function1() {
    tokio::time::delay_for(tokio::time::Duration::from_secs(1)).await; //等待一秒钟
    println!("function1 ++++ ");
}

async fn function2() {
    println!("function2 ++++ ");
}

async fn async_main() {
    let f1 = function1();
    let f2 = function2();

    // 使用await则会顺序执行,使用join则会并发执行f1和f2
    // f1.await;
    // f2.await;
    futures::join!(f1, f2);
}

fn main() {
    let mut runtime = Runtime::new().unwrap();
    runtime.block_on(async_main());
    println!("Hello, world!");
}

  • Cargo.toml配置
[dependencies]
futures = "0.3.5"
tokio = { version = "0.2", features = ["full"] }

结果分析

如果在async_main中使用的await执行,则执行结果如下:

function1 ++++ 
function2 ++++ 
Hello, world!

如果在async_main中使用join执行,则执行结果如下:

function2 ++++ 
function1 ++++ 
Hello, world!

try_join宏

try_join和join宏类似,唯一的区别就是,当执行发送错误时就马上返回。

示例

  • 源码
//src/main.rs
use futures::try_join;
use tokio::runtime::Runtime;
use std::io::Result;

async fn function1() -> Result<()> {
    tokio::time::delay_for(tokio::time::Duration::from_secs(10)).await;
    println!("function1 ++++ ");
    Ok(())
}

async fn function2() -> Result<()> {
    println!("function2 ++++ ");
    Ok(())
}

async fn async_main() {
    let f1 = function1();
    let f2 = function2();

    // f1.await;
    // f2.await;
    if let Err(_) = try_join!(f1, f2) {
        println!("Err!")
    }
}

fn main() {
    let mut runtime = Runtime::new().unwrap();
    runtime.block_on(async_main());
    println!("Hello, world!");
}

  • Cargo.toml配置文件
[dependencies]
futures = "0.3.5"
tokio = { version = "0.2", features = ["full"] }

  • 运行结果
function2 ++++ 
function1 ++++ 
Hello, world!

相关文章

  • 007 Rust 异步编程,通过 join 执行 Future

    前言 在之前我们主要介绍了通过await和block_on执行Future,但是这两种方式实际上都是顺序执行的方式...

  • 003Rust异步编程,Future trait介绍

    Future介绍 Future是Rust异步编程的核心,Rust异步编程基本都是围绕Future来展开。那么,什么...

  • Flutter -- 9.异步编程

    一.使用Future异步编程 Dart中使用Future完成异步操作 1.基本的异步代码示例 任务代码块,执行的异...

  • [Dart] Future

    异步编程 Dart中通过 Future 和 Stream 实现异步,谈论他们之前,先简单了解一下什么叫异步。 As...

  • Dart异步编程-future

    Dart异步编程包含两部分:Future和Stream该篇文章中介绍Future 异步编程:Futures Dar...

  • 【译文】Rust异步生态系统

    原文:选自《Rust异步编程》第8章 异步生态系统[https://rust-lang.github.io/asy...

  • 【译文】Rust异步编程: Pinning

    原文:选自《Rust异步编程》第4章 Pinning[https://rust-lang.github.io/as...

  • 异步 Apex 类

    异步Apex类 一个Apex类可以定义为异步类,用于异步执行。 异步类可以通过多种方式实现: Future注解 批...

  • rust异步

    Future Trait Future是rust异步的核心,代表一个将来会产生值的一个东东。调用poll方法可以让...

  • Python 期物之 concurrent.futures.Fu

    Python 期物用在异步编程,所谓期物指的是排定的执行事件。Python 3.4起 Future 源码 单从 F...

网友评论

    本文标题:007 Rust 异步编程,通过 join 执行 Future

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