文章《The Waker Allocation Problem》
作者:Yoshua Wuyts (Rust 异步工作组成员)
此文探讨了 Rust 异步系统中 Waker
分配问题,以及 !Send Waker
的问题。
文章指出,为了实现高效的并发执行,异步任务需要中间 Waker 来唤醒子任务,但这带来了两种困境:
- 不分配内存时,唤醒行为呈二次方复杂度(O(N²)),大量任务时效率低下;
- 分配内存时,虽可实现线性复杂度(O(N))唤醒,但隐藏的内存分配又会影响性能。
作者通过 future::join
函数的实现示例,展示了如何通过创建中间 Waker 来优化唤醒行为。
当前 Future
特性设计存在诸多问题,不仅仅是上述内存分配问题,还有 Send
和 Sync
约束问题:在单线程系统中, Waker 仍然需要 + Send + Sync
约束。
即使如果我们最终添加一个 LocalWaker 类型,仍然需要原始 Waker 类型存在。这意味着我们实际上无法编写可移植的基于异步的 !Send
库,因为该绑定永远不会在类型系统中出现。
这些问题限制了异步编程的灵活性和效率,作者计划在后续文章中进一步阐述这些问题。
阅读:https://blog.yoshuawuyts.com/the-waker-allocation-problem/
sdr-podcast:sans-io
在本期 SDR Podcast 中,James 和 Amos 就 sans-io 技术展开了热烈讨论。
sans-io 是一种编写协议库的方法,主张将解码和状态机逻辑与实际的 I/O 操作分离,以提高代码的可移植性和可测试性。
James 认为,尽管 sans-io 有其优势,但 async/await 的出现使得编译器能够自动生成状态机,从而减少了手动编写状态机的需求。
他指出,使用 async/await 可以避免复杂的循环和匹配语句,使代码更加简洁易读。
Amos 则认为,尽管 async/await 有其便利之处,但 sans-io 在某些情况下仍然是一个更好的选择,尤其是在需要与底层 I/O 系统紧密集成时。
他还提到,async/await 的一些问题,如栈溢出和调试困难,仍然需要解决。
两人还讨论了 Rust 语言的未来发展,以及如何更好地支持 async/await 编程。
收听:https://sdr-podcast.com/episodes/sans-io
Slides:https://sdr-podcast.com/slides/2025-06-11-sans-io.pdf
sdr-podcast:在 macOS 上自动化截取透明 DOM 元素的图片
在本期 SDR Podcast 中,Amos Wenger 探讨了如何自动化 macOS,特别是如何获取透明的 DOM 元素截图。
他分享了自己在制作文章和视频时,如何通过自动化工具提高效率。
Amos 介绍了多种方法,包括使用 Safari 的开发者工具、AppleScript 和 JXA(JavaScript for Automation)。
他还讨论了如何利用 macOS 的无障碍功能来控制应用程序,并展示了如何通过 AppleScript 操作 Safari 的开发者工具来捕获元素截图。
尽管过程中遇到了许多挑战,但 Amos 最终成功实现了自动化截图,显著提高了工作效率。
收听:https://sdr-podcast.com/episodes/automating-macos
Slides:https://sdr-podcast.com/slides/2025-06-04-automating-macos.pdf
jemalloc 已归档,事后回顾
Jason Evans 对 jemalloc 内存分配器 20 年发展历程进行了回顾。
jemalloc 最初是为 Lyken 编程语言开发的,后因 FreeBSD 系统对多处理器支持的需求,被集成到 FreeBSD 中。尽管在集成后遇到了严重的内存碎片化问题,但经过改进,jemalloc 成为了 FreeBSD 的一部分。
随后,jemalloc 被移植到 Linux 和 Windows 系统,并在 Firefox 中得到应用,但与 Firefox 的集成并不顺利。
2009 年,jemalloc 开始在 Facebook 的基础设施中使用,Facebook 的内部数据对 jemalloc 的开发起到了巨大的推动作用。然而,随着 Facebook 转变为 Meta,对 jemalloc 的投入逐渐减少。
文章最后提到,目前 jemalloc 的上游开发已经结束,未来可能需要其他人创建分支来继续发展。
阅读:https://jasone.github.io/2025/06/12/jemalloc-postmortem/
文章《从零构建 2D 导航网格寻路系统》
这篇文章介绍了如何从零开始构建一个2D导航网格(navmesh)寻路系统。
作者使用Rust语言,通过Delaunay三角剖分生成基础导航网格,并将其转换为图结构以供A*算法使用。
文章详细解释了如何定位点在三角形中的位置、移除被阻塞的节点、优化路径等关键步骤,并提供了交互式演示。
作者还讨论了该系统在实际应用中的局限性,如路径次优、边缘问题、多单位移动等,并提出了改进方向。
阅读:https://gabdube.github.io/articles/navmesh_pathfinding/navmesh_pathfinding.html
Reddit:https://www.reddit.com/r/rust/comments/1lp0lpa/2d_navmesh_pathfinding_in_rust/
Hayro:PDF 光栅化工具
hayro
是一个用纯 Rust 编写的实验性 PDF 光栅化 (rasterizer) 工具,目前是该领域最全面的实现之一,但仍有许多功能缺失和问题待解决,代码也需要清理和文档化。
其在线演示工具可在 https://laurenzv.github.io/hayro 访问,但网页版不支持嵌入的 JPEG2000 图像。
编者注:PDF 光栅化是指将 PDF 文件中的矢量图形、文字和图像等内容转换为光栅图像(位图)的过程。光栅图像由像素组成,每个像素都有一个颜色值,适合在屏幕上显示或打印。
仓库:https://github.com/LaurenzV/hayro
Reddit:https://www.reddit.com/r/rust/comments/1lp7hlz/hayro_an_experimental_workinprogress_pdf/
Clickhouse-arrow:高性能 ClickHouse 客户端库,原生集成 Arrow
clickhouse-arrow
是一个高性能的 Rust 客户端库,用于与 ClickHouse 数据库交互,支持原生协议和 Apache Arrow 集成。
它提供零拷贝反序列化、最小化内存分配、高效流式处理大数据集等功能,支持 LZ4 和 ZSTD 压缩,兼容 ClickHouse Cloud。
该库还支持从 Arrow 架构直接创建 ClickHouse 表、精细控制类型映射等。
它基于 Tokio 构建,支持连接池,具有 90% 以上的测试覆盖率。
仓库:https://github.com/GeorgeLeePatterson/clickhouse-arrow
Reddit:https://www.reddit.com/r/rust/comments/1lpcklg/clickhousearrow_v010_highperformance_clickhouse/
视频:介绍线程 - Rust 惯用语法的简单步骤第 15 集
观看:http://youtube.com/watch?v=04PZPs7fbuo
讨论:写了 5 年的 Rust 代码,我仍然只是 .clone()
直到编译通过
高赞回答:
“我发现,简单的范例(以引用作为参数并返回拥有的值)已经消除了 95% 的 .clone () 使用率。”
“好!反正一半的 C++ 代码都是隐式地这么做的。我敢发誓,Rust 成长过程中的很多烦恼都源于调用 clone 时感觉不好,而在 C++ 中,在同一个地方传递值却不会感觉不好,因为 C++ 的语义和 clone 完全一样。”
Reddit:https://www.reddit.com/r/rust/comments/1lpc85o/ive_been_writing_rust_for_5_years_and_i_still/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论