Mkdir700's Note

Mkdir700's Note

Rust

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

在开发桌面剪贴板同步应用(UniClipboard)时,遇到了一个令人蛋疼的问题:每次构建时 Rust 编译器会重新编译 objc2 库,严重影响开发效率。问题主要集中在 objc2 库编译耗时长、无谓的重复编译和循环依赖等方面。为解决这一问题,优化方案包括优化 Cargo 配置、使用 sccache 加速编译等。通过这些优化策略,首次完整构建虽略有增加,但对非依赖代码的修改后,构建时间减少了80%以上,大大提高了开发效率。经验总结包括深入了解依赖关系、差异化处理、合理利用编译缓存以及权衡取舍等。这些优化技巧适用于处理objc2库及其他慢速编译依赖的Rust项目,有助于提高开发效率。
195
0
1
2025-03-29

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

在 Rust 开发中,类型转换是常见需求。文章介绍了在优化类型转换代码过程中遇到的问题和解决方案。首先通过实现 `From` trait 来改进类型转换方式,但需要注意传入参数的类型匹配。然后针对不同路径类型的传入参数,使用泛型参数使 `From` 实现更通用和灵活。重点介绍了 `AsRef` trait 在 Rust 中转换引用的重要性,提高了接口灵活性和避免了重复实现。通过这次重构,代码更符合 Rust 惯用法,更灵活,利用了 Rust 强大的类型系统,可应用于多种类型转换场景,尤其适合设计接受多种相似类型参数的 API。在 Rust 中,建议优先使用标准 trait 进行类型转换,使用 `AsRef` / `AsMut` 实现灵活引用转换,通过泛型参数使 API 更通用。
158
0
0
2025-03-28

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

在 Rust 异步编程中,一个常见错误是在持有 Mutex 锁的情况下使用 .await,导致编译错误。问题在于 MutexGuard 不是 Send 的,在 .await 点可能会在不同线程间切换,违反了线程安全。解决方案是在 await 前释放锁,通过额外作用域确保 MutexGuard 在 .await 前被释放。其他解决方案包括使用专为异步设计的锁如 tokio::sync::Mutex,以及使用更细粒度的锁策略减少持有时间。总结指出在异步编程中避免在持有 Mutex 锁时使用 .await,释放所有 MutexGuard 后再调用 .await,并优先使用作用域块控制锁的生命周期。
170
0
0
2025-03-16

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

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

Tokio:应该使用哪种 mutex?

互斥锁用于保护共享数据,防止多个线程同时访问。标准库互斥锁会阻塞线程直到获取锁,适合短持有场景;而异步互斥锁会挂起任务而不阻塞整个线程,并允许跨越`.await`点持有锁。标准库适合保护内存数据、锁持有短、无需异步操作,性能开销小;异步适合需要异步操作、长时间持有锁、不想阻塞线程的场景。最佳实践是默认选择标准库互斥锁,并对于IO资源考虑使用异步互斥锁及专门管理任务。
203
0
1
2025-03-15

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

在 Windows 平台构建 Rust 时可能会出现 openssl-sys 缺失错误,需要手动安装 OpenSSL。使用 choco 安装 OpenSSL,并设置环境变量 OPENSSL_DIR 和 OPENSSL_LIB_DIR,重启 VSCode 后即可解决问题。
Tec
966
0
0
2024-09-16
解决 Rust 测试中的并行执行冲突:保护共享资源的策略

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

在 Rust 开发中,测试是确保代码质量的关键环节。并行执行测试可能导致共享资源冲突问题,影响测试的有效性。为解决这一问题,可以使用 serial_test crate 进行测试串行执行,使用互斥锁控制资源访问,创建独立的测试环境隔离测试,或者利用测试模块和一次性初始化共享初始化逻辑。另外,可以使用 #[ignore] 属性标记并独立运行特定测试。选择合适的策略可有效保护共享资源,确保测试的可靠性和一致性。
Tec
114
0
0
2024-09-13