rust学习-同时执行多Future

这篇具有很好参考价值的文章主要介绍了rust学习-同时执行多Future。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

只用 .await 来执行future,会阻塞并发任务,直到特定的 Future 完成

join!:等待所有future完成

可事实上为什么都是res1完成后再执行res2?
join! 不保证并发执行,难道只负责同步等待?

示例

[package]
name = "rust_demo5"
version = "0.1.0"
edition = "2021"

[dependencies]
futures = "0.3"
tokio = {
    version = "1.16.0", features = ["full"] }
tokio-stream = "0.1.14"
use futures::executor::block_on;
use std::thread::sleep;
use std::thread;
use std::time::Duration;
use futures::{
   future, join};

async fn task_one() {
   
	println!("task_one: begin");
    thread::sleep(Duration::from_secs(4));
	println!("task_one: finish");
}

async fn task_two() {
   
	println!("task_two: begin");
    thread::sleep(Duration::from_secs(2));
	println!("task_two: finish");
}

#[tokio::main]
async fn main() {
   
    let (res1, res2) = join!(task_one(), task_two());
    // 在这里调用 res1 和 res2,它们分别对应异步任务1和异步任务2的输出结果
    // 先执行完task_one,再执行完task_two,然后再返回
}
use futures::executor::block_on;
use std::thread;
use futures::{
   future, join};

async fn task_one() {
   
	println!("task_one: begin");
    for i in 1..=10_000_000 {
   
        if i % 100_000 == 0 {
   
            println!("task_one,  found a number: {}", i);
        }
    }
	println!("task_one: finish");
}

async fn task_two() {
   
	println!("task_two: begin");
    for i in 1..=10_000_000 {
   
        if i % 100_000 == 0 {
   
            println!("task_two,  found a number: {}", i);
        }
    }
	println!("task_two: finish");
}

#[tokio::main]
async fn main() {
   
    let (res1, res2) = join!(task_one(), task_two());
    // 在这里调用 res1 和 res2,它们分别对应异步任务1和异步任务2的输出结果
}

反例

不必在 get_book 完成后再 get_music

async fn get_book_and_music() -> (Book, Music) {
   
    let book = get_book().await;
    let music = get_music().await;
    (book, music)
}

try_join

返回 Result 的 future,考虑使用 try_join! 而非 join
join 只会在所有子 future 都完成后才会完成,它甚至会在子 future 返回 Err 之后继续处理
try_join! 会在其中的子future返回错误后立即完成

use futures::try_join;

async fn get_book() -> Result<Book, String> {
    /* ... */ Ok(Book) }
async fn get_music() -> Result<Music, String> {
    /* ... */ Ok(Music) }

async fn get_book_and_music() -> Result<(Book, Music), String> {
   
    let book_fut = get_book();
    let music_fut = get_music();
    try_join!(book_fut, music_fut)
}

传进 try_join! 的 future 必须要用相同的错误类型。
考虑使用 futures::future::TryFutureExt 库的 .map_err(|e| …) 或 err_into() 函数来统一错误类型:文章来源地址https://www.toymoban.com/news/detail-646589.html

use futures::{
   
    future::TryFutureExt,
    try_join,
};

// Result 类型用于更好地处理和组织错误情况,并在避免出现非预期错误时提供便捷

// 一种是一个内部类型为 Book 的成功结果,另一个是一个无内部类型 () 的错误结果
async fn 

到了这里,关于rust学习-同时执行多Future的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包

    Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是  函数式编程 ( functional programming )。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 更具体的,我们将要涉及: 闭包 ( Closures ),一个可以储

    2024年02月12日
    浏览(51)
  • Rust 程序设计语言学习——基础语法

    Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软

    2024年01月22日
    浏览(50)
  • MobaXterm多个窗口同时执行shell命令

    项目中需要两个系统时间同步,我想自己简单的测试下程序是不是正常,最直观的想法是同时在两个系统里执行date命令,看两个命令的差值是不是在合理范围之内 所以简单记录下使用MobaXterm远程连接服务器时,在两个窗口中同时执行shell命令的操作步骤 开启两个tab,分别s

    2024年02月11日
    浏览(55)
  • Linux系统中同时执行多个脚本运行方法(&&、||、;、&)

            前一个运行成功后,才运行下一个。单进程执行。 注意: 若中途某个脚本执行报错,后面的脚本不再执行。 修改bb.py文件:         前一个运行失败后,才运行后面一个脚本。单进程执行。 注意: 遇到第一个执行成功的脚本后,后面的脚本不再执行。 修改

    2024年02月16日
    浏览(51)
  • 【从零开始的rust web开发之路 一】axum学习使用

    第一章 axum学习使用 本职java开发,兼架构设计。空闲时间学习了rust,目前还不熟练掌握。想着用urst开发个web服务,正好熟悉一下rust语言开发。 目前rust 语言web开发相关的框架已经有很多,但还是和java,go语言比不了。 这个系列想完整走一遍web开发,后续有时间就出orm,还

    2024年02月12日
    浏览(52)
  • DBeaver同时执行多条insert into报错处理

    之前使用的数据库连接软件Navicat的破解版,后来公司要求不可以使用破解版的Navicat,所以就换了DBeaver。 这是一个很不错的软件,免费,而且可以连接不同类型的数据库,MySQL、Oracle、hive、SQLserver等都可以使用,很方便也很良心,但是在使用的过程中发现了一个问题,DBeav

    2024年02月11日
    浏览(52)
  • 【Linux】进程概念与fork初识——if与else竟然能够同时执行?!

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月01日
    浏览(34)
  • Rust 性能优化 : Rust 性能优化技巧,提升 Rust 程序的执行效率和资源利用率 The Rust Performance

    作者:禅与计算机程序设计艺术 在过去的几年中,随着编程语言的快速发展,编程人员已经逐渐从依赖编译型语言转向了使用解释型语言。相对于编译型语言来说,解释型语言具有更快的执行速度,在某些情况下甚至可以实现接近编译器的运行时效率。但是另一方面,这些语

    2024年02月07日
    浏览(89)
  • 如何用java实现同时进行多个请求,可以将它们并行执行,从而减少总共的请求时间。

    1.使用线程池 通过使用Java提供的线程池,可以将多个请求分配到不同的线程中并行执行。可以通过创建固定数量的线程池,然后将请求分配给线程池来实现。线程池会自动管理线程的数量和复用,从而减少了线程创建和销毁的开销,提高了程序的性能。 以下是使用线程池实

    2024年02月12日
    浏览(57)
  • 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

    Rust 已经听了无数遍,我很清楚它很强!但我也刚了解到它比较难学!那么加上 ChatGPT 呢?下面的代码就是在 ChatGPT 加持下写出来的,我只起到了辅助作用!只能说它们都很厉害! Rust(又称为 Rust programming language)是一种系统编程语言,主要用于开发底层系统和应用程序,如

    2024年02月13日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包