18|双管齐下,两全其美:编写同时支持同步和异步的代码
鸟窝

你好,我是鸟窝。
在前几节课我们已经学习了 Rust 的异步编程的基本知识,以及第三方的异步运行时,这节课我们讨论作为一个库的开发者的困境:如何开始同时支持同步和异步的 SDK?
同步(阻塞)or 异步?
这个同步你可以看作是阻塞,并没有严格区分这两个概念的区别。
试想这么一个场景,你想为你的产品提供一个公共的 API,你需要把你的产品特性封装成供用户使用的 API,比如你开发了一个 NoSQL 数据库,需要提供给用户调用的 API。一般情况下,或者几年前,我们认为这是一件很简单的事情,正常把一个个特性实现为对应的 API 即可。
但是,async/.await 编程模式突然出现了,这股风潮以及它带来的遍历让你不禁想实现一个异步的 API。因为操作数据库涉及大量 I/O 操作,使用异步编程看起来是合理的。
现在,你不得不维护两套代码,一套是同步的代码,一套是异步的代码,这些代码底层的业务逻辑又是类似的,如何有效地同时提供同步和异步的代码呢?这也是 Mario Ortiz Manero 在开发 rspotify 这个库时遇到的困境以及一些总结,这给了我很多的启发,所以我专门单列一节课,结合我的一些经验来介绍它,毕竟有可能我们的一部分工作就是要开发各种 crate,这样就会遇到类似的问题。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. 方案一:复制相同的代码,但存在代码重复和维护成本高的问题 2. 方案二:基于异步代码实现同步代码,但存在初始化运行时的开销和重复代码问题 3. 方案三:使用 `remove-async-await` 宏自动生成同步代码,简化同时提供异步和同步的代码 4. 方案四:使用 `maybe_async` 库根据开关生成同步和异步代码,遵循“优先使用异步”的策略 5. `maybe_async` 提供的统一特性开关和属性宏,以及其用法 6. `remove-async-await` 宏的使用和好处 7. `maybe_async` 属性的三种用法 8. 通过宏的方式简化同时提供异步和同步的代码的实现 9. Winter `maybe-async` 库提供的 `maybe_async`、`maybe_await` 和 `maybe_async_trait` 宏,能够让你在同步和异步代码之间无缝切换 10. 解决同时支持同步和异步的代码开发中的问题和挑战
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》,新⼈⾸单¥98
《Rust 并发编程实战课》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论