何时可传递 Non-Send的 Future ?
本文深入探讨了异步Rust中有关跨越 .await
时借用非Sync数据的问题。首先回顾了Send和Sync自动traits,这些traits是Rust库中支持无畏并发的特性,通过静态检查确保非线程安全的数据结构不会从其原始线程中逃逸。作者解释了这两个特性的关系,并通过例子说明了在异步Rust中,尽管Rust强调无畏并发,但在处理异步编程时仍存在一些限制。特别是,作者提到了一个与Tokio工作窃取运行时结合使用的例子,展示了在异步环境中使用非线程安全数据结构的限制。最后,作者提出了一种更好的spawn方法,以更好地支持异步环境中的非Send类型。
原文链接 https://matklad.github.io/2023/12/10/nsfw.html
for await
以及和stream的斗争
for await
上是对当前异步流最常见迭代方式的一种简写,但是在处理并发查询时可能导致其他的问题。
for await item in stream { /* process item */ }
while let Some(item) = stream.next().await { /* process item */ }
作者通过一个实际的批处理作业的例子,作者描述了使用buffered combinator来同时执行多个异步查询时可能出现的问题。具体来说,当一个异步任务的执行时间较长时,可能导致其他任务在等待时长时间内处于暂停状态,从而引发超时问题。作者提出了几种解决方案,涉及到是否在关键位置使用spawn、修改组合器的文档以提醒用户可能的问题,以及是否应该重新设计组合器。文章最后呼吁对异步Rust的原语进行更多的实际测试和实验,并探讨了未来可能的语言特性
原文链接 https://tmandry.gitlab.io/blog/posts/for-await-buffered-streams/
Rust 超越面向对象编程: 第三部分 继承
本文讨论了 继承 在Rust中的角色以及为何它在面向对象编程中可能并不是理想选择的文章。作者通过分析继承的起源和在静态OOP语言中的使用情况,提出了Rust中没有直接的继承概念,而是通过其他方式达到相同效果。文章还讨论了继承对记录类型和模块的影响,并强调了在涉及虚拟方法时继承可能导致的问题。最后,作者提供了一些替代继承的设计模式,以及在Rust中如何更好地表示这些模式。
原文链接 https://www.thecodedmessage.com/posts/oop-3-inheritance/
Rust playgound 现在支持 stdin 输入
Rust Playground现在在执行面板下方添加了一个输入字段。这个字段允许你写入stdin,因此你可以运行类似于Rust书第2章中的猜数字游戏的交互式程序.
猜数字游戏的Playground地址 https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9c3f8db40093fba040aadd3c7fcdac1e
YDLIDAR Tmini Pro Rust 驱动实现
ydlidar_driver 是 YDLIDAR Tmini Pro(一款激光雷达) 的 Rust驱动. 下面是他的演示效果.
github 地址 https://github.com/tier4/ydlidar_driver
--