当前位置: 首页 > news >正文

rust 同时处理多个异步任务,并在一个任务完成退出

use std::thread;
use tokio::{
    sync::mpsc,
    time::{sleep, Duration},
};

async fn check_for_one() {
    // 该函数会每秒打印一次 "write"
    loop {
        println!("write");
        sleep(Duration::from_secs(1)).await;
    }
}

async fn start_print_task() -> Result<(), ()> {
    // 在新线程中运行 Tokio 运行时
    thread::spawn(move || {
        // 创建一个新的 Tokio 运行时
        let rt = tokio::runtime::Runtime::new()
            .unwrap_or_else(|e| panic!("Failed to create Tokio runtime: {}", e));

        // 使用 Tokio 运行时执行异步任务
        rt.block_on(async move {
            check_for_one().await;
        });
    });

    // 返回一个已完成的 Future,方便配合 select! 使用
    sleep(Duration::from_secs(1)).await;
    Ok::<(), ()>(())
}

#[tokio::main]
async fn main() {
    // 创建一个只发送“信号”的通道,类型为 ()
    let (tx, mut rx) = mpsc::channel::<()>(1);

    // 启动打印任务,返回一个 Future
    let print_task = start_print_task();

    // 启动另一个异步任务,2 秒后向通道发送“信号”
    tokio::spawn(async move {
        sleep(Duration::from_secs(2)).await;
        let _ = tx.send(()).await;
    });

    // 使用 tokio::select! 监听
    tokio::select! {
        val = rx.recv() => {
            match val {
                Some(_) => println!("rx1 completed first with signal"),
                None => println!("rx1 channel closed"),
            }
        }
        _ = print_task => {
            println!("start_print_task completed");
        }
    }

    println!("main thread exiting");
}

使用select!宏 ,来完成 只要有一个异步任务完成,就会退出异步监听。

相关文章:

  • PythonJSON解析如何优雅处理嵌套JSON字符串
  • springboot中使用async实现异步编程
  • Docker Compose 部署Nginx反向代理 tomcat
  • 每日算法-250407
  • 数字经济产业标杆:树莓集团如何塑造产业服务价值体系
  • 没有独立显卡如何安装torch
  • 极简设计的力量:用 `apiStore` 提升项目效率与稳定性
  • oracle查询是否锁表了
  • Objective-C语言的编程范式
  • 昇腾910b多机部署deepseek-r1-w8a8量化全攻略
  • Hive 常见面试 300 问
  • leetcode 368. 最大整除子集 中等
  • Scala(六)
  • Matlab绘图—‘‘错误使用 plot输入参数的数目不足‘‘
  • 工程项目中通讯协议常见问题
  • 零代码构建AI知识库:基于亮数据网页抓取API的维基百科数据自动化采集实战
  • 昂贵的DOM操作:一次DOM导致的性能问题排查记录
  • 自动化测试是什么?Selenium实战!
  • 【分享开发笔记,赚取电动螺丝刀】使用STM32F103的hal库,采用PWM+DMA发送方式驱动WS2812的RGB彩灯
  • k8s介绍
  • 国家统计局:2024年城镇单位就业人员工资平稳增长
  • 悬疑剧背后的女编剧:创作的差异不在性别,而在经验
  • 制造四十余年血腥冲突后,库尔德工人党为何自行解散?
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 重温经典|开播20周年,仙剑的那些幕后你知道吗?