返回
从Futures 0.1到0.3:经验分享
见解分享
2023-09-30 10:31:15
最近我将一个中小型的 crate 从 futures 库的 0.1 迁移至了 0.3 版本。过程本身不是特别麻烦,但还是有些地方或是微妙棘手,或是没有很好的文档说明。这篇文章里,我会把迁移经验总结分享给大家。
我所迁移的 crate 是 TiKV 的 Rust Client。该 Client 基于 futures 0.1 版本开发,已经运行多年,一直比较稳定。最近由于业务需要,该 Client 需要支持一些新的特性,而这些特性在 futures 0.1 中还没有实现,因此需要将其迁移至较新的版本。
迁移过程总体来说比较顺利,但还是遇到了不少坑。下面我会列出一些需要注意的地方,希望对其他准备进行类似迁移的开发者有所帮助。
1. **futures 0.1 和 0.3 的 API 有较大差异**
futures 0.1 和 0.3 的 API 有较大差异,这主要体现在以下几个方面:
* **Future 的返回类型** :在 futures 0.1 中,Future 的返回类型是 `Result<T, E>`,而在 futures 0.3 中,Future 的返回类型是 `T`。
* **Future 的错误类型** :在 futures 0.1 中,Future 的错误类型是 `Error`,而在 futures 0.3 中,Future 的错误类型是 `Box<dyn Error>`。
* **Future 的组合操作** :在 futures 0.1 中,可以使用 `join!` 和 `select!` 等宏来组合 Future,而在 futures 0.3 中,需要使用 `Future::join` 和 `Future::select` 等方法来组合 Future。
2. **futures-util 库的重命名**
futures-util 库在 futures 0.3 中被重命名为 `futures-util-0.3`。因此,在迁移时需要将 `futures-util` 的依赖项替换为 `futures-util-0.3`。
3. **一些 API 的使用方式发生变化**
一些 API 的使用方式在 futures 0.3 中发生 了变化。例如,在 futures 0.1 中,可以使用 `Poll::Pending` 和 `Poll::Ready` 来表示 Future 的状态,而在 futures 0.3 中,需要使用 `Poll::Pending` 和 `Poll::Ready(T)` 来表示 Future 的状态。
4. **需要处理一些兼容性问题**
在迁移过程中,可能会遇到一些兼容性问题。例如,在 futures 0.1 中,可以使用 `compat` 模块来处理兼容性问题,而在 futures 0.3 中,需要使用 `futures-compat` crate 来处理兼容性问题。
5. **可能需要对代码进行一些重构**
在迁移过程中,可能需要对代码进行一些重构。例如,在 futures 0.1 中,可以使用 `async` 来声明异步函数,而在 futures 0.3 中,需要使用 `async fn` 来声明异步函数。
6. **需要对测试代码进行一些修改**
在迁移过程中,需要对测试代码进行一些修改。例如,在 futures 0.1 中,可以使用 `assert_ok!` 和 `assert_err!` 来断言 Future 的结果,而在 futures 0.3 中,需要使用 `assert_eq!` 和 `assert_ne!` 来断言 Future 的结果。
以上是一些在迁移过程中需要注意的地方。希望对其他准备进行类似迁移的开发者有所帮助。
最后,我想说的是,迁移是一个比较复杂的过程,需要考虑很多因素。在迁移之前,一定要做好充分的准备工作。例如,需要评估迁移的风险,制定迁移计划,并在迁移过程中做好测试工作。只有这样,才能保证迁移的顺利进行。