当前位置: 首页 > 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.jsqmd.com/news/38523/

相关文章:

  • 2025年衣柜顶线定做厂家权威推荐榜单:石膏顶线/欧式顶线/脚线源头厂家精选
  • 完整教程:AI编程工具(Cursor/Copilot/灵码/文心一言/Claude Code/Trae)AI编程辅助工具全方位比较
  • 【IEEE出版 | 连续4年稳定EI检索】第五届新能源与电力工程国际学术会议(ICNEPE 2025)
  • 习题解析之:计算圆周率——拉马努金法
  • 【刷题笔记】Placing Squares
  • P2279 [HNOI2003] 消防局的设立 题解加总结
  • 火车头采集器教程:夸克网盘批量转存(附工具)
  • 售后无忧!CRMEB售后订单处理指南,高效管理退款退货流程
  • 全景式数据库风险监测的理论与实践:加密防御与低误差识别的安全革新
  • 5分钟极简代码:轻松学会XXTEA加密解密
  • 痛苦在虚无中回荡 神最终恩赐了绝望 是爱恨交织的冲撞 你永无力再违抗
  • 习题解析之:计算圆周率——无穷级数法
  • 实用指南:JVM(十)-- 类的加载器
  • Qoder 降价,立即生效!首购 2 美金/月
  • AE扩展-After Ease v1.1.4 关键帧动画曲线缓入缓出调节
  • 更新了!微信公众号文章数据批量导出excel软件1.1版,轻松实现统计分析
  • 中国数据集成平台TOP10综合评估报告(2025)
  • 从“实时分账”到“智能问数”:汇付天下以“Data Agent”重塑支付业务决策效率
  • 热身赛总结 题解
  • 2025年气流流型检测仪品牌推荐与选择制造企业权威推荐榜单:灌装机气流流型检测仪/气流流型验证服务/烟雾发生器源头厂家精选
  • 告别重复“点点点”!基于Dify工作流,打造能思考、会决策的自主测试智能体
  • 开盖扫码领红包小程序系统:实体商家的营销增长利器
  • Vue---开发数字大屏大屏
  • es 如果主分片坏了,一个副本分片是最新的和主分片一样怎么操作变为主分片怎么操作
  • el-table展开行内容增加后没有出现滚动条
  • 海报积分商城小程序:高效吸粉与礼品兑换的全能解决方案
  • 智能体同工作流的关系和区别
  • 出入门禁管理应用:智能高效的出入口管控解决方案
  • 习题解析之:正负交错数列前n项和
  • vmware+centos7虚拟机连接不到网络的问题