首页 > 编程语言 >007 Rust 异步编程,通过 join 执行 Future

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

时间:2022-11-07 11:36:51浏览次数:42  
标签:function1 join await ++++ Future 007 async main


前言

在之前我们主要介绍了通过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!


标签:function1,join,await,++++,Future,007,async,main
From: https://blog.51cto.com/u_15862521/5828345

相关文章

  • 000007 PHP 比较运算符
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';//比较运算符/***$a==$b等于true,如果类型转换后$a等于$b。*$a==......
  • 使用AspectJ-@AfterReturning(returning ret),@Around (ProceedingJoinPoint pjp)环绕
    开始使用AspectJ1.[掌握]@AfterReturning后置通知-注解有returning属性在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回值。该注解......
  • 开始使用AspectJ-实现步骤@Aspect,@Before,还有其中的JoinPoint参数
    开始使用AspectJ1.maven依赖<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dep......
  • 1007. 行相等的最少多米诺旋转
    1007.行相等的最少多米诺旋转在一排多米诺骨牌中,A[i]和B[i] 分别代表第i个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从1到6的数字同列平铺形成的 ......
  • Solution-P7650 [BalticOI 2007 Day 1] Ranklist Sorting(DP)
    容易发现一条性质:每个人最多只会被移动一次。说明人只有两种:移动的和不移动的。考虑枚举所有不移动的人,并最优化其它人的移动顺序。最开始第\(i\)个人的起点为\(i\),终......
  • FutureTask 源码解析
    Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行,也可以由调用......
  • CompletableFuture 组合式异步编程
    ​​CompletableFuture​​​是jdk1.8引入的一个新特性。它主要是为了解决多个​​Future​​结果之间的依赖关系。比如:将两个异步计算合并为一个——这两个异步计算之间相......
  • Fork/Join框架运行原理
    Fork/Join框架的入门可以参考​​Fork/Join框架​​。Fork/Join框架的核心类有两个一个是ForkJoinPool,它主要负责执行任务;一个是ForkJoinTask,主要负责任务的拆分和结果的合......
  • 007k8s诡异详细记录
    一、getpods的诡异现象记录#Init的状态的pod已经不是Running了,但是它恢复后pod的name不会变,而且RESTARTS的次数为0,注意下这个!!!root@xx-qq-bj:~#kubectl--kubeco......
  • 多线程中的wait与join
        wait一个Object的方法,目的是将调用obj.wait()的线程置为waiting的状态,等待其他线程调用obj.notify()或者obj.notifyAll()来唤醒。最常见的就算生产者/......