最近经常写的程序主要就是Python, JavaScript, 以及TypeScript了, 用上Python3以及新版本的Tornado之后, 似乎强制被使用了asyncio. 借这篇文章我就讲讲自己对async/await关键字的一些看法. 因为我是普通开发者, 所以这些观点可能比较偏表面.

忘记await

第一个问题是, 在Python中, 调用了async函数时, 可能忘记await, 不只是Python, JavaScript中也有这个现象, 在编码时很容易忽略.

有可能各位细心一些可能不会忘记. 但是假如你忘记了, 代码只有执行到的时候才会报错. 针对这个问题, 尤其建议大家写测试用例, 防止自己因为粗心而丢掉了await.

就我自己感觉而言, 强类型语言更加适合使用async与await, 因为如果你没有await, 编译器会直接给出错误, 例如TypeScript, 我基本没有丢过await, 因为编译器直接就报错了.

学习与使用成本

作为开发者, 我并不认为async/await的学习成本低, 我在自己的一篇博客中分享了有关协程以及Asyncio的学习, 你仍然需要了解yield.

而且, 引入了新的关键字后, 几乎需要在async, 函数的整个调用链上的所有函数都加入async, 考虑到Python的简洁性, 我个人还是不喜欢加入async/await的.

对于monkey patch来说, 它复杂的逻辑隐藏的更好, 并且对原代码没有侵入性, 如果能正确的使用, 普通开发者根本不需要担心任何async/await问题.

总结

对于我接手的业务应该很少会依赖asyncio, 我也不打算引入. 对于个人项目来说, 我更喜欢golang和TypeScript, 毕竟强类型语言维护起来方便很多. 如果一定要使用asyncio, 也应该只在特定的库上进行使用.

附录

在搜索时, 我发现Reddit上也有过相关讨论我该继续使用asyncio还是返回gevent.

![][3]

[3]: https://rawforcorvofeng.cn/www.reddit.com_r_Python_comments_7a3ikv_should_i_stick_with_asyncio_or_return_to_gevent_(iPad).png