Mkdir700's Note

Mkdir700's Note

Rust

Rust 项目中解决依赖重复编译问题:以 objc2 为例

在开发桌面剪贴板同步应用(UniClipboard)时,遇到一个问题:即使只修改与 objc2 库无关的代码,每次构建时 Rust 编译器会重新编译 objc2 库,影响开发效率。问题源自 objc2 库编译耗时长、重复编译、循环依赖。通过优化 Cargo 配置、使用 sccache 缓存工具等策略,提升构建效率,减少非依赖代码修改后的构建时间,改善开发体验。经验总结包括理解依赖关系、差异化处理、合理利用缓存、权衡取舍等,适用于处理慢速编译依赖的 Rust 项目,提高开发效率和编码体验。
50
0
1
2025-03-29

Rust 中优雅地实现类型转换:从自定义方法到通用 trait

在 Rust 开发中,优化类型转换的问题是常见的。文章描述了作者在项目中使用自定义静态方法实现类型转换的背景,并尝试改进为更符合 Rust 风格的通用 trait。作者首先尝试使用 From trait,但遇到了泛型参数不匹配的问题,通过使用元组解决。然后,遇到了路径类型不匹配的错误,最终采用泛型参数方式解决了该问题。通过实现泛型参数,代码变得更通用,能接受多种路径类型。重点强调了 AsRef trait 的重要性,提供了灵活的引用转换机制。总结指出,符合 Rust 惯用法、灵活性、和利用了类型系统是这种重构的优势,适用于需要设计接受多种相似类型的 API 的场景。在 Rust 中,建议优先使用标准 trait 进行类型转换,使用 AsRef / AsMut 实现引用转换,通过泛型参数使 API 更通用。
32
0
0
2025-03-28

Rust 异步线程安全问题解析与修复

在 Rust 异步编程中,常见错误是在持有 Mutex 锁的情况下使用 .await,导致编译错误。这是因为 MutexGuard 不是 Send 的,违反了 Rust 的线程安全保证。解决方案是在 await 前释放锁,通过作用域控制和提取数据确保安全操作。其他解决方案包括使用专为异步设计的锁如 tokio::sync::Mutex,以及减少锁的持有时间。总结来说,在 Rust 异步编程中要避免在持有 Mutex 的锁时使用 .await,释放 MutexGuard 后再执行异步操作,考虑使用异步友好的锁并控制锁的生命周期。
48
0
0
2025-03-16

Tokio:为什么异步互斥锁比同步互斥锁更"昂贵"

异步互斥锁相比于同步互斥锁更昂贵的原因在于其复杂的内部实现和与异步运行时的集成带来的额外开销。异步互斥锁需要管理任务等待队列、唤醒机制,通常依然使用同步锁作为额外的间接层,并需要创建和管理Future对象。因此,在不需要在跨越await点时持有锁的情况下,推荐使用标准同步互斥锁。只有在需要在持有锁的同时执行异步操作时,异步互斥锁的额外开销才是值得的。
36
0
0
2025-03-15

Tokio:应该使用哪种 mutex?

互斥锁是一种同步原语,用于保护共享数据,确保只有一个线程可以访问。标准库互斥锁在调用.lock()时会阻塞线程,而异步互斥锁会挂起任务。标准库互斥锁性能开销小,适合短时间持有;异步互斥锁支持异步操作,适合需要持有锁同时执行异步操作的场景。最佳实践是默认选择标准库互斥锁,对于IO资源考虑使用专门管理任务。何时使用哪种锁取决于需求,标准库适合保护纯内存数据,异步适合需要执行异步操作或长时间持有锁的场景。
63
0
1
2025-03-15

解决在 Windows 上 openssl-sys 构建失败的问题

在 Windows 上构建 Rust 时遇到 openssl-sys 错误,提示缺少 OpenSSL。解决方法是使用 choco 安装 OpenSSL,并设置相应环境变量后重启 VSCode。详情可参考 https://juejin.cn/post/6994715287178182693。
Tec
441
0
0
2024-09-16
解决 Rust 测试中的并行执行冲突:保护共享资源的策略

解决 Rust 测试中的并行执行冲突:保护共享资源的策略

在 Rust 开发中,测试是确保代码质量的关键环节。然而,并行执行测试可能导致共享资源冲突。为解决这一问题,可使用 serial_test crate 标记应该串行执行的测试,使用互斥锁确保资源独占,创建独立测试环境避免干扰,将相关测试组织到模块使用 Once 进行初始化,以及使用 #[ignore] 属性分离问题测试。选择合适策略取决于具体需求和项目结构,但重要的是意识到并行测试可能带来的问题并采取相应措施确保测试可靠性。
Tec
65
0
0
2024-09-13