返回

从Futures 0.1到0.3:经验分享

见解分享




最近我将一个中小型的 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 的结果。

以上是一些在迁移过程中需要注意的地方。希望对其他准备进行类似迁移的开发者有所帮助。

最后,我想说的是,迁移是一个比较复杂的过程,需要考虑很多因素。在迁移之前,一定要做好充分的准备工作。例如,需要评估迁移的风险,制定迁移计划,并在迁移过程中做好测试工作。只有这样,才能保证迁移的顺利进行。