< 返回版块

苦瓜小仔 发表于 2025-05-25 09:37

Tags:日报

RustWeek 直播回放和 All Hands 会议记录

RustWeek ( https://rustweek.org ) 是 5 月 13 - 17 日在荷兰举办的 RustNL 和 Rust 1.0 十周年庆祝活动。

有两日公开演讲和两日 Rust 项目内部会议(All Hands)。

公开演讲分为三个同时进行的会场 (tracks):

All Hands 会议主要是 Rust 项目团队成员面对面讨论交流:

cargo-dist 已死

当前版本的 cargo-dist 使用“ubuntu-20.04”作为 Github runner,但此 runner 在 4 月已从 Github Action 中删除而不再被支持。

cargo-dist 的网站 https://axodotdev.github.io/cargo-dist/ 也关闭了,其开发人员已不在 axodotdev。

当前的解决方式:在 dist-workspace.toml 中指定

[dist.github-custom-runners]
global = "ubuntu-22.04"

或者使用来自 Astral 的非官方分支 cargo-dist,由 Gankra(cargo-dist 的原作者)维护,但主要为了给 Astral 开发:

新仓库:https://github.com/astral-sh/cargo-dist

Reddit:https://www.reddit.com/r/rust/comments/1kufjn6/psa_cargodist_is_dead/

文章《The impl trait drop glue effect》

作者:CrumblingStatue

这篇文章探讨了 Rust 中 impl Trait 的一个潜在问题:当将具体返回类型改为 impl Trait 时,可能会导致意外的借用检查器错误。

作者通过一个音乐播放器的例子来说明这个问题。在例子中,Playlist 结构体的 iter 方法最初返回一个具体的迭代器类型,代码可以正常编译运行。然而,当作者将返回类型改为 impl Iterator 时,代码出现了借用检查器错误。

这是因为 impl Trait 隐藏了返回类型的细节,导致编译器无法确定返回类型是否有 Drop 实现,从而影响了借用检查器的逻辑。

作者提出了一个问题:是否有办法在 impl Trait 中编码是否存在 Drop 实现,以及是否应该这样做。最后,作者提供了一个简单的解决方案,即通过在表达式周围添加一个块来解决编译错误。

阅读:https://crumblingstatue.github.io/blog-thingy/impl-trait-drop-glue.html

Reddit:https://www.reddit.com/r/rust/comments/1kuavtv/the_impl_trait_drop_glue_effect/

文章《A Tale of Testability and Sending Non-Send Types in Rust》

作者:geo-ant

这篇文章探讨了在 Rust 中如何测试涉及多线程和非 Send 类型的代码。

作者以一个简单的多线程播放音乐的函数为例,展示了直接传递非 Send 类型到线程中会导致编译错误。为了解决这个问题,作者尝试了多种方法,包括手动实现 Send、使用 MutexArc,但这些方法都因安全性和适用性问题而不可行。

最终,作者提出了一个“高级依赖倒置”的解决方案:传递一个构造函数(闭包)到线程中,而不是直接传递实例。这种方法不仅使代码可测试,还增强了代码的灵活性和可维护性。作者强调,这种设计虽然增加了复杂性,但其带来的好处是值得的。

阅读:https://geo-ant.github.io/blog/2025/rust-testability-and-non-send-types/

Reddit:https://www.reddit.com/r/rust/comments/1kucqzo/a_tale_of_testability_and_sending_nonsend_types/

基准测试:使用 Zig 和 Rust 实现异步 Epoll 服务器

作者:Gunth15

这篇文章是关于作者用 Zig 和 Rust 两种语言实现一个异步 Epoll 服务器的比较。

作者通过这个项目来深入了解异步控制流,并比较这两种语言在实现异步 Epoll 服务器时的性能和内存效率。

项目分为三个主要部分:Watcher、线程池和 Poller。

作者详细描述了在使用 Zig 和 Rust 过程中的体验,包括遇到的错误、语言特性以及测试情况。

最终结果显示,Rust 版本在多线程下处理请求更快,但内存使用更高且稳定性稍差;Zig 版本内存使用更少且更稳定。

仓库:https://github.com/Gunth15/Epoll-implementation-comparison

Reddit:https://www.reddit.com/r/rust/comments/1kuq7l2/small_epoll_test/

Pipex - 函数式管道语法宏

pipex 是一个强大的 Rust 宏,用于构建功能丰富的管道,支持同步、异步、并行和流式操作。它具有以下特点:

  • 同步操作:可链式进行常规同步转换
  • 异步操作:自动处理异步工作
  • 并行处理:利用多核 CPU,可配置线程池
  • 流式处理:处理大数据集,可配置缓冲区大小
  • 错误处理:内置 Result 处理,支持 async? 语法
  • 混合工作负载:无缝结合不同操作类型
  • 性能优化:兼顾吞吐量和资源效率

它提供了丰富的示例,涵盖 CPU 密集型、I/O 密集型、错误处理和混合工作负载等场景。

还提供了性能优化指南,如 CPU 密集型工作使用并行处理,I/O 密集型工作使用流式处理等。

let result = pipex!(
    vec![1, 2, 3, 4, 5]
    => |x| x * 2
    => |x| x + 1
);

let result = pipex!(
    vec!["https://api1.com", "https://api2.com", "https://api3.com"]
    => async |url| {
        // Simulate HTTP request
        tokio::time::sleep(std::time::Duration::from_millis(100)).await;
        format!("Data from {}", url)
    }
    => |response| response.len()
);

仓库:https://github.com/edransy/pipex

Reddit:https://www.reddit.com/r/rust/comments/1ktv6fz/introducing_pipex_a_functional_pipeline_macro_for/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页