异步 Rust 的未来:async fn in trait 稳定后,生态会发生什么变化的预测
异步 Rust 的未来async fn in trait 稳定后生态会发生什么变化的预测保持学习保持输出。async fn in trait 终于要稳定了作为一个每天跟 Future 和 Pin 较劲的 Rust 萌新这事儿我盯了快半年了。// 想写一个异步 trait但编译器不让你这么写 trait DataFetcher { async fn fetch(self, url: str) - String; // 编译错误 // error[E0706]: functions in traits cannot be declared async }然后搜索引擎告诉你用async-trait这个宏吧。于是你写use async_trait::async_trait; #[async_trait] // 宏生成的代码会把 async fn 转换成返回 PinBoxdyn Future 的形式 trait DataFetcher { async fn fetch(self, url: str) - String; // 宏展开后才能用 }能用是能用了但每次看到PinBoxdyn FutureOutput String这种类型签名我都忍不住想问为什么原生不支持呢好消息是async fn in trait 正在稳定化的路上。这意味着上面那段代码很快就不需要async-trait宏了。但真正有意思的不是语法层面的变化而是这个特性对 Rust 异步生态的深层影响。一、async fn in trait 到底是什么对于刚接触这个概念的同学我用一张图来解释async-trait宏方案和原生方案的区别简单来说async-trait给你的是能用原生方案给你的是高效优雅灵活。性能差异不是纸上谈兵——我们来看一段对比代码// async-trait 方案 use async_trait::async_trait; #[async_trait] pub trait Service { async fn call(self, input: str) - String; } // 宏展开后call 方法实际上变成了 // fn calla(a self, input: a str) // - PinBoxdyn FutureOutput String Send a // // 问题 // 1. PinBoxdyn Future —— 每次调用都要在堆上分配 // 2. dyn Future —— 虚函数调用编译器无法内联 // 3. Send a —— 生命周期约束可能不满足 // 原生方案稳定后 pub trait Service { async fn call(self, input: str) - String; } // 编译器自动生成一个关联类型 // trait Service { // type CallFuturea: FutureOutput String a // where Self: a; // // fn calla(a self, input: a str) - Self::CallFuturea; // } // // 优势 // 1. 关联类型是编译期确定的 —— 零堆分配 // 2. 静态分发 —— 编译器可以内联优化 // 3. 生命周期更灵活 —— 不强制 static在一个高频率调用 trait 方法的场景比如 Web 框架的中间件链路原生方案每个请求少做一次Box::pin()积少成多就是显著的吞吐量差异。二、谁会最先受益async fn in trait 稳定后以下几个领域的生态变化会最明显我来逐一分析Web 框架axum/actix-webTower 的Servicetrait 是目前异步 trait 使用的重灾区大量使用async-trait宏。稳定后Tower 可以移除对宏的依赖中间件组合的性能会得到提升。// Tower Service trait 的未来形态示意 use std::future::Future; pub trait ServiceRequest { type Response; type Error; // 稳定后可以原生声明异步方法 async fn call(self, req: Request) - ResultSelf::Response, Self::Error; } // 中间件可以这样组合不需要 PinBoxdyn Future 了 pub struct TimeoutMiddlewareS { inner: S, timeout: Duration, } implS, Req ServiceReq for TimeoutMiddlewareS where S: ServiceReq, { type Response S::Response; type Error S::Error; async fn call(self, req: Req) - ResultSelf::Response, Self::Error { // 利用原生支持不需要额外包装 Future tokio::time::timeout( self.timeout, self.inner.call(req), ).await .map_err(|_| /* 超时错误处理 */)? } }数据库驱动sqlx/sea-orm数据库连接池、事务管理这些场景大量依赖异步 trait。原生支持后不再需要为每个查询做额外的堆分配。嵌入式 Rustembassy这是最引人注目的方向。async-trait需要堆分配Box而嵌入式环境通常没有堆。原生支持让嵌入式 Rust 也能享受异步编程的便利不需要任何运行时开销。三、对普通开发者的影响什么时候该切我的建议分为三个阶段// 第一阶段现在2026年7月 // 继续用 async-trait但要了解原生方案的进展 #[async_trait] trait MyService { async fn process(self, data: [u8]) - Vecu8; } // 第二阶段nightly 可用后预计 2026年Q3 // 在个人项目/实验项目中试用 #![feature(async_fn_in_trait)] trait MyService { async fn process(self, data: [u8]) - Vecu8; // 原生支持 } // 第三阶段stable 稳定后预计 2026年底-2027年初 // 生产项目中逐步迁移享受零开销带来的性能提升对于正在学 Rust 的同学我的建议是现在继续用async-trait它很成熟文档齐全没有坑理解背后的原理Pin、Future、状态机原生方案只是让语法更自然底层原理不变关注 RFC 讨论了解边界情况和限制避免稳定后踩坑// 用原生 async fn in trait 时需要注意 Send 约束 use std::future::Future; // 如果要在线程间传递需要显式约束 pub trait AsyncProcessor { async fn process(self, data: String) - String where // 编译器自动推断的关联 Future 类型需要满足 Send Self: Send Sync; // 确保 Future 可以跨线程 } // 多线程环境下的正确用法 async fn run_processor(processor: Arcdyn AsyncProcessor) { let handle tokio::spawn(async move { // processor 可以在任务间传递因为满足了 Send 约束 processor.process(hello.to_string()).await }); let result handle.await.unwrap(); println!(处理结果: {}, result); }四、生态变化的三个趋势预测基于我对 Rust 生态的观察async fn in trait 稳定后会催生三个趋势趋势一trait 定义大爆发现在很多库为了避免async-trait的依赖和性能问题选择用枚举代替 trait或者直接用函数。原生支持后异步 trait 会成为异步抽象的首选方式库的 API 设计会更加自然。趋势二no_std 异步生态兴起嵌入式 Rust 社区一直在等这个特性。没有堆分配的异步 trait 让 embassy、RTIC 这些嵌入式框架可以在不牺牲性能的前提下提供高层抽象。这可能是 Rust 在 IoT 和嵌入式领域的一个转折点。趋势三异步代码与非异步代码的边界模糊// 未来可以更自然地混合同步和异步 trait trait Storage { // 同步方法只需要读内存缓存 fn get_cached(self, key: str) - Option[u8]; // 异步方法需要访问磁盘或网络 async fn fetch_remote(self, key: str) - ResultVecu8; // 异步方法的默认实现可以调用同步方法 async fn get(self, key: str) - ResultVecu8 { // 先查缓存同步 if let Some(data) self.get_cached(key) { return Ok(data.to_vec()); } // 缓存未命中远程获取异步 self.fetch_remote(key).await } }同步和异步方法在同一个 trait 里共存这在以前是需要宏才能做到的事情。这种混搭能力会让库的设计更加贴近真实业务场景——不是所有操作都需要异步也不是所有操作都能同步完成。五、总结async fn in trait 的稳定化虽然看起来只是一个语法层面的改进但它对生态的影响是结构性的性能提升是实打实的。从动态分发到静态分发、从堆分配到栈分配高频调用的场景下差异明显。对 Web 框架来说这意味着更低的延迟和更高的吞吐。嵌入式 Rust 才是最大赢家。no_std 环境下的异步编程因为 async fn in trait 而变得可行。这个市场虽然小众但对 Rust 的系统编程语言定位至关重要。迁移策略要稳。async-trait至少还会是主流方案一年以上。作为学习者理解原理比追新特性更重要。原生方案和宏方案的核心概念Future、Pin、状态机是完全一致的。我现在就开始用 nightly 试了。在自己的 side project 里体验一下原生方案的语法等 stable 的那天就可以直接迁移。保持学习保持输出。异步 Rust 的未来看起来真的很好——尤其是对于我这种被PinBoxdyn Future...折磨过的选手来说。资料说明本文中的协议、版本、性能、成本和行业趋势应以可核验的一手资料为准。未标注统计口径的比例、时间表和预测仅作工程讨论不应视为行业事实。可参考 0730 资料来源索引并在发布前将具体来源贴到对应断言之后。

相关新闻

7月球类运动AI路线图——从关键点检测到智能训练闭环演进路径

7月球类运动AI路线图——从关键点检测到智能训练闭环演进路径

7月球类运动AI路线图——从关键点检测到智能训练闭环演进路径 一、视频帧与运动学参数的语义鸿沟:球类运动AI的"感知退化" 球类运动的AI分析面临一个独特的挑战:关键点检测的像素误差和运动学参数的语义精度之间存在非线性放大关系。举个例子…

2026/10/5 22:56:43 阅读更多 →
按难度分发的模型路由:让便宜模型先答,难题再升级

按难度分发的模型路由:让便宜模型先答,难题再升级

按难度分发的模型路由:让便宜模型先答,难题再升级 负责 LLM 应用成本、质量或平台工程的团队,经常遇到同一个取舍:所有请求都交给旗舰模型,稳定但成本高;全部切到小模型,退款规则、多步计算和长…

2026/10/3 11:16:41 阅读更多 →
Go 2.0 展望:泛型之后,下一个改变后端开发的是什么

Go 2.0 展望:泛型之后,下一个改变后端开发的是什么

Go 2.0 展望:泛型之后,下一个改变后端开发的是什么 一、泛型的落地回顾:1.18 的承诺兑现了多少 Go 1.18 引入泛型已经两年多。回头审视,当初社区对泛型的期待和实际落地之间存在不小的温差。乐观派预测泛型会让整个标准库重写&a…

2026/10/12 5:27:12 阅读更多 →

最新新闻

Pygame打造2D射击游戏:游戏循环与碰撞检测全解析

Pygame打造2D射击游戏:游戏循环与碰撞检测全解析

简介:基于J2ME平台的一款简单飞机射击游戏完整代码,面向手机游戏开发初学者,旨在帮助读者理解移动设备上游戏程序的基本架构与核心逻辑。整个压缩包共200个文件、约4.27MB,包含11个Java源码和22个class编译文件,以及13…

2026/10/15 18:05:17 阅读更多 →
图集拆分全攻略:从JSON格式解析到锚点回填避坑

图集拆分全攻略:从JSON格式解析到锚点回填避坑

简介:图集拆分工具是一款面向白鹭引擎(Egret)游戏开发者的实用软件,用于将合成的SpriteSheet图集按JSON配置解析并切割为单个图像文件,覆盖角色动画帧、UI元素等常见资源,解决图集不便单独编辑和替换的痛点…

2026/10/15 18:05:17 阅读更多 →
立达标讯|1.4亿!2026年9月重庆15个学校实验室重点项目盘点

立达标讯|1.4亿!2026年9月重庆15个学校实验室重点项目盘点

2026年9月,重庆各学校实验室建设迎来新一轮招标高峰,涵盖重点实验室设备更新、中小学理化生实验室升级、科创实验室改造等多个领域。据立达标讯统计,本月公开招标、预告及采购公告中,学校相关实验室重点项目(百万预算以…

2026/10/15 18:05:17 阅读更多 →
零基础考软考怎么起步:10个科目资料整理(初级为主)

零基础考软考怎么起步:10个科目资料整理(初级为主)

之前分享过几篇软考资料,有朋友说科目太多不知道从哪看起。这篇专门写给完全没接触过软考的人,我按"第一次考"的场景挑了 10 个科目,每个科目用几句大白话说清楚它是干嘛的、适合谁,链接和提取码都放在条目后面&#xf…

2026/10/15 18:05:17 阅读更多 →
Python爬虫文章标题抓取实战:从静态解析到动态渲染

Python爬虫文章标题抓取实战:从静态解析到动态渲染

简介:这是一份面向Python爬虫初学者的docx教程文档,以requests和BeautifulSoup为核心,完整演示了批量抓取网页文章标题并保存到文本文件的实现流程。文档并非只贴一段代码,而是从环境搭建开始,逐步拆解了库的安装方法、…

2026/10/15 18:05:17 阅读更多 →
OpenLLMetry LiteLLM 插桩指南:为统一 LLM 网关生成 gen_ai.* 链路与指标

OpenLLMetry LiteLLM 插桩指南:为统一 LLM 网关生成 gen_ai.* 链路与指标

LLMOps可观测性 【免费下载链接】openllmetry Open-source observability for your GenAI or LLM application, based on OpenTelemetry 项目地址: https://gitcode.com/gh_mirrors/op/openllmetry 点击查看 免费下载 本篇技术指南聚焦 openllmetry 仓库中的 opent…

2026/10/15 18:04:16 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →