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

前言#

在之前我们主要介绍了通过 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!
本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐一冲
文章
255
粉丝
122
喜欢
308
收藏
128
排名:328
访问:2.9 万
私信
所有博文
社区赞助商