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

Rust:关于Future和JoinHanlder的思考

Future和JoinHandler是不同的,但这两个都与异步(多线程)相关。

概念不同

  • JoinHandler:是指一个异步方法的句柄,用来监控或控制这个异步方法,以及接收异步方法的执行结果。
  • Future:表示的是在未来某个时刻执行的代码片段

执行的时机不同

  • JoinHandler:在有该对象的时候,该对象对应的异步任务已经开始执行,或已经进入执行队列了。
  • Future:Future只是代表未来某个时刻执行的代码片段,只有在开始调用时才开始执行。

相关联的点

JoinHanlder.join()方法和Future.await都是在当前线程下同步等待异步方法结束。
tokio::spawn()方法接收Future参数,并返回一个JoinHanlder对象。

写了一个小例子

use std::{sync::mpsc, thread, time::Duration};use tokio::runtime::Runtime;fn main() {let p = Person {name: "张三".into(),age: 19,};let (tx, rx) = mpsc::channel();let handler1 = std::thread::spawn(move || {println!("hanlder1 start run, and sleep 3s");thread::sleep(Duration::from_secs(3));println!("handler1 sleep completed!");match tx.send(p) {Ok(_) => println!("hanlder1 send success"),Err(err) => eprintln!("{err}"),}});let handler2 = std::thread::spawn(move || {println!("handler2 had run");match rx.recv() {Ok(_p) => println!("recv success"),Err(err) => eprintln!("{err}"),}});let f = async {println!("我是Future,需要等待调用才会执行");thread::sleep(Duration::from_secs(10));println!("Future执行结果");};println!("main thread will sleep 10s");thread::sleep(Duration::from_secs(10));let hander2_res = handler2.join();let hander1_res = handler1.join();if let Err(err) = hander2_res {eprintln!("hander2 run failed! {:?}", err);return;}if let Err(err) = hander1_res {eprintln!("handler1 run failed,{:?}", err);return;}println!("start run tokio thread");let rt = Runtime::new().expect("create tokio runtime failed!");rt.block_on(f);println!("completed!");
}//send:在线程间移动所有权//sync:在线程间可以共享只读的借用struct Person {name: String,age: u8,
}
http://www.zskr.cn/news/47561.html

相关文章:

  • 【刷题笔记】Placing Squares
  • P2279 [HNOI2003] 消防局的设立 题解加总结
  • 售后无忧!CRMEB售后订单处理指南,高效管理退款退货流程
  • 5分钟极简代码:轻松学会XXTEA加密解密
  • 更新了!微信公众号文章数据批量导出excel软件1.1版,轻松实现统计分析
  • 中国数据集成平台TOP10综合评估报告(2025)
  • 从“实时分账”到“智能问数”:汇付天下以“Data Agent”重塑支付业务决策效率
  • 热身赛总结 题解
  • 开盖扫码领红包小程序系统:实体商家的营销增长利器
  • 海报积分商城小程序:高效吸粉与礼品兑换的全能解决方案
  • 习题解析之:正负交错数列前n项和
  • 详细介绍:【Kylin V10】Ambari3.0.0 安装 Unexpected error Ambari repo file path not set for current OS 报错解决
  • 实战干货:Apache DolphinScheduler 参数使用与优化总结
  • 实用指南:Rust Slint实现列表式消息提示(Notification Dialog)源码分享
  • RED 状态
  • EMS4100N芯祥科技USB3.1高速双向模拟开关芯片资料,可pin对pin替代ASW3410
  • 2025年网络攻防领域常用工具、软件及其应用场景
  • NSIS启动前检测字体缺失,静默安装字体
  • github action 个人项目实践
  • 2025年1.5吨蒸汽发生器源头厂家权威推荐榜单:优质蒸汽发生器/商用蒸汽发生器/暖特加蒸汽发生器源头厂家精选
  • 10分钟搞懂!化学人刚需的6大核心期刊
  • 2025-2026年水质测定仪品牌推荐:总磷/总氮/氨氮/COD测定仪哪个品牌好?
  • 2025年电镜实验室安装订做厂家权威推荐榜单:电镜实验室设计/电镜安装/电镜实验室建设源头厂家精选
  • 激光二极管增透膜技术:提升光学性能的关键方案
  • 【传奇开心果系列】基于Flet框架实现的桌面代码登录验证和SQLite 数据库结合实现数据持久化和多页面导航自定义组件模板特色和达成原理深度解析
  • 2025预埋件/幕墙/钢结构预埋件厂家推荐鑫诚源,专业生产各类连接件
  • 2025铝排/铝棒/铝板厂家推荐山东宜发,导电合金材质齐全品质保障
  • 一份用pyhon生成word/wps文档的代码
  • 2025年比较好的超强承重天地铰链厂家实力及用户口碑排行榜
  • MX Round 23 解题报告