当前位置: 首页 > 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);// 启动打印任务,返回一个 Futurelet 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!宏 ,来完成 只要有一个异步任务完成,就会退出异步监听。


http://www.mrgr.cn/news/97355.html

相关文章:

  • 毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六)
  • Nginx 生产配置文件
  • 数据分析-Excel-学习笔记Day1
  • TYUTJava阶段测试
  • 新一代AI架构实践:数字大脑AI+智能调度MCP+领域执行APP的黄金金字塔体系
  • java发送http请求
  • k8s 1.23升级1.24
  • k8s之Ingress讲解
  • TDengine 从入门到精通(2万字长文)
  • 线程池/内存池/mysql连接池
  • 15分钟完成Odoo18.0安装与基本配置
  • Nginx 常见面试题
  • 现代Web表单验证的终极解决方案:构建可扩展的企业级验证系统
  • sentinel新手入门安装和限流,热点的使用
  • 003集——《利用 C# 与 AutoCAD API 开发 WPF 随机圆生成插件》(侧栏菜单+WPF窗体和控件+MVVM)
  • Gerapy二次开发:用户管理专栏页面样式与功能设计
  • 2024 天梯赛——工业园区建设题解
  • C++ 内存访问模式优化:从架构到实践
  • 协同控制与分布式控制 —— 理论、案例与交互式 GUI 实现
  • 进程内存分布--之理论知识