尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Rust 入门实战(7):并发与异步入门
上一篇的泛型仓库能替换存储实现但所有调用仍在单线程顺序执行。本篇先用线程与通道完成 CPU/阻塞工作再用 Tokio 演示异步调度解释Send、Sync、锁范围和取消安全而不是只记住.await。一、痛点并发、并行与异步不是同义词并发描述多个任务在时间上推进并行表示多个任务在多个核心同时执行异步是一种在等待时主动让出执行权的并发模型。CPU 密集计算适合线程池并行成千上万网络连接大多在等待 I/O适合异步运行时。把阻塞文件或计算直接放进异步执行器会卡住承载其他任务的工作线程。Rust 的类型系统把部分并发错误提前Send表示值可在线程间转移Sync表示共享引用可在线程间安全使用。它们多由编译器自动推导。Rc非原子计数不可跨线程Arc使用原子计数可共享所有权。共享可变状态还需Mutex或RwLock计数本身不会保护内部数据。优先消息传递生产者移动消息给消费者所有权边界简单。确实需要多个线程读写同一映射时才用ArcMutexT并尽量缩短持锁时间。二、原理线程所有权与通道背压thread::spawn闭包通常要求static用move把拥有值移入线程。通道发送端可克隆给多个生产者接收端迭代直到所有发送端释放。无界通道可能在生产快于消费时增长内存真实系统应采用有界队列或明确限流。usestd::sync::mpsc;usestd::thread;#[derive(Debug)]structResultItem{id:u32,score:u32}fnscore(id:u32)-u32{(1..id).map(|value|value*value).sum()}fnmain(){let(sender,receiver)mpsc::channel();letmuthandlesVec::new();foridin1..4{letworker_sendersender.clone();handles.push(thread::spawn(move||{letitemResultItem{id,score:score(id)};worker_sender.send(item).expect(接收端仍存在);}));}drop(sender);forhandleinhandles{handle.join().expect(工作线程不应 panic);}letmutresults:Vec_receiver.into_iter().collect();results.sort_by_key(|item|item.id);foriteminresults{println!(id{} score{},item.id,item.score);}}运行输出id1 score1 id2 score5 id3 score14 id4 score30线程完成顺序不确定所以输出前按编号排序。并发测试若依赖自然调度顺序会偶发失败稳定输出必须来自显式排序或协议保证。join不仅等待还传播线程 panic生产代码应转换为错误并决定是否继续。三、实现用 Tokio 调度等待型任务异步函数调用后返回Future只有被.await或运行时轮询才推进。等待点可能暂停当前任务因此不要跨.await长时间持有同步锁。下面项目在Cargo.toml加tokio { version 1, features [full] }每个任务模拟一次远程请求。usetokio::task::JoinSet;usetokio::time::{sleep,Duration};#[derive(Debug)]structTask{id:u32,title:staticstr}asyncfnfetch(task:Task)-String{letdelayDuration::from_millis((5-task.id)asu64*10);sleep(delay).await;format!({}:{},task.id,task.title)}#[tokio::main]asyncfnmain(){lettasks[Task{id:1,title:文档},Task{id:2,title:测试},Task{id:3,title:服务},Task{id:4,title:部署},];letmutsetJoinSet::new();fortaskintasks{set.spawn(fetch(task));}letmutvaluesVec::new();whileletSome(result)set.join_next().await{values.push(result.expect(任务不应 panic));}values.sort();forvalueinvalues{println!(result{value});}}运行输出result1:文档 result2:测试 result3:服务 result4:部署JoinSet管理一组动态任务并显式接收完成结果。直接spawn后丢弃句柄会让错误无处观察。超时可用tokio::time::timeout包裹 future但超时只停止等待底层操作是否取消、是否产生部分副作用要查具体 API 契约。四、踩坑锁、阻塞与无限制 spawn持MutexGuard做网络请求会让其他任务等待最慢 I/O。正确做法是在锁内读取或更新最小数据释放锁后再.await。标准库锁适合短且不跨等待点的临界区确需跨异步等待的锁可用 Tokio 版本但更应重新审视状态所有权。异步不自动更快。少量顺序任务使用普通阻塞代码更简单CPU 密集计算应交给专用线程池或spawn_blocking否则执行器延迟上升。无限tokio::spawn会造成连接、内存和下游压力应用信号量限制在途数量并让队列长度可观测。死锁不仅是两把锁互等也可能因任务持锁等待另一个需要同锁的任务。统一锁顺序、减少共享状态、用消息循环单独拥有状态都能降低风险。并发 bug 难靠一次运行发现设计时要明确关闭、取消、超时和错误传播路径。五、验证让非确定调度产生确定结论测试结果集合而非完成顺序时间相关测试使用 Tokio 的暂停时间能力减少真实睡眠。通道必须验证发送端关闭后消费者能退出有界队列要测试满载策略。共享计数测试应多次运行并用线程检测工具或模型检查库补充关键同步逻辑。现在任务可以并发处理并异步等待但依赖和特性还写在单一包里。下一篇转向 Cargo 工程化拆分库与二进制、使用 feature、workspace、锁文件和发布配置让后面的网络服务拥有清晰项目骨架。参考来源Rust BookFearless ConcurrencyRust 标准库std::syncTokio TutorialAsync Book异步编程 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《Rust 入门实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
RELATED

相关推荐

Rust 入门实战(4):错误处理与 Result

Rust 入门实战(4):错误处理与 Result

上一篇的集合查询会遇到缺失键,文本解析也可能收到非法内容。本篇不再用默认值掩盖问题,而是用 Option 表示“可能没有”,用 Result 表示“可能失败”,并建立从底层原因到用户提示的错误链。 一、痛点:panic 不是普通…

📅 2026/10/9 15:17:01
构建分析器刷新按钮第二次失效?状态管理与竞态排查实战

构建分析器刷新按钮第二次失效?状态管理与竞态排查实战

这个标题一看就是研发群里被打出来的问题描述:build analyzer 的刷新按钮,第二次点了没反应。而且拼写还是错乱的,analayzer、seccond time,问题本身却真实得不能再真实。我们在做一个构建数据分析面板时,同样被这个问…

📅 2026/9/6 18:48:26
Java面试八股文核心考点:JVM、并发与集合底层原理详解

Java面试八股文核心考点:JVM、并发与集合底层原理详解

1. 2022年Java面试为什么绕不开八股文2022年我接触了不少准备跳槽或者校招的Java朋友,大家吐槽最多的不是算法题,而是“八股文”这三个字。明明项目里很少直接用,面试却一轮接一轮地问;明明背了小本本,面试官一句“为什…

📅 2026/9/15 11:04:05
MORE NEWS

更多资讯

📰

Model-Optimizer:大模型推理加速的标准化流水线解析

1. “Model-Optimizer”不是工具名,而是工程共识——它指代一类特定技术动作的集合很多人第一次看到“Model-Optimizer”这个词,下意识会以为是个开源项目、某个GitHub仓库名,或者某家公司的商业化产品。我刚接触这个术语时也这么想&#xff…

📰

LabVIEW Modbus串口通信:VISA组帧、CRC校验与轮询模块

简介:这份PDF技术文档围绕LabVIEW 7.11环境下Modbus串口通讯协议的实现展开,面向工业自动化、测控系统开发及软件测试人员,重点解决PC上位机与PLC等下位设备之间的主从式串口通信问题。内容结合ASCII与RTU两种传输模式,讲解消息帧…

📰

什么是Buzz?技术场景中的传播机制与工程实现

我无法基于当前输入生成符合要求的博文。原因在于:您提供的输入内容中,项目标题仅为“buzz”一词,且后续所有字段(项目正文、关键词、摘要描述)均为空或未提供有效信息。根据我的角色设定与创作原则,我必须…

📰

蜂鸣器原理与Arduino声光报警实践

我无法基于当前输入生成符合要求的博文。 原因如下: 输入中仅提供了项目标题 "buzz" ,以及空的“相关热搜词”和“最新网络热词”字段(内容为 ),未提供任何实质性的【项目正文】、【关键词】或【摘要描…

📰

同人企划合规指南:GPL-3.0、素材授权与社区贡献闭环

做同人企划做到第三年,最容易翻车的环节往往不在美术或者代码,而在“这东西到底谁能用、怎么用、用了要不要回馈”这一层。《卫戍协议:盟约》从最早的一份设定草案,长到现在有代码仓库、素材仓库、外加一堆外部贡献者提交的分支&a…

📰

HTML5现代Web开发实战:从数据看板到3D地图

1. 项目概述:HTML的无限可能十年前我刚接触前端开发时,HTML在我眼中只是个简单的标记语言。直到某天看到同事用纯HTMLCSS实现了动态数据面板,才意识到这个基础技术的真正潜力。这次我们将通过几个典型Demo,展示HTML在现代Web开发中…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬