异步编程的核心在于由三件事协同而成, 分别是事件循环, 还有协程调度, 以及I/O等待, async/await的本质是要使得单线程能够以并发处理那些具有高延迟的任务;事件循环需要主动去驱动, 协程对象必须要进行显式调度(通过await或者其他方式), 阻塞操作一定要替换为异步版本, 同步库是需要使用的, 共享状态需要用到.Lock, 超时有必要进行显式控制。

关乎异步编程的核心之处, 并非在于语法糖, 而是在于事件循环, 以及协程调度, 还有I/O等待所形成的协同机制。把握第59讲的重点所在, 是去领会async/await背后究竟怎样让单线程能够"同时"处理多个具有高延迟特性的任务, 并非仅仅是记住该如何去书写async def。
事件循环(Event Loop)是异步系统的唯一引擎
任意async函数均得于事件循环里运行, 它并非后台服务,乃是你主动开启且持续予以驱动的主干程序。提供.run()去帮你进行隐式的创建以及关闭, 然而在生产环境当中常常要手动加以管理, 就像是Web服务器长久运行那般。
协程对象 ≠ 运行中的任务,需显式调度
被调用的async def函数所返回的是一个协程对象, 此对象什么都不做, 直至其被事件循环执行才行。常见的误区就在于认为func()等同于"启动异步任务"。
Linux版
官方所提供的 Linux 版, 是 3.14.6 的 Linux/Unix 源码包, 它适宜于在 Linux/Unix 环境里开展安装、运行代码的操作, 同时还能够用于学习函数、模块以及脚本开发。
下载
实战中高频踩坑点与应对技巧
真实的项目当中, 异步的难点常常隐匿于边界之处, 存在着同步库混合运用、资源彼此争逐、异常进行传播, 以及存在超时控制等情况。
其并非复杂, 然而却易被忽视, 异步并非是那种无所不能的加速手段, 对于CPU密集类型的任务而言, 假若使用异步反而会变得更加缓慢, 在处于该运用或者不该运用的时候, 千万别生硬嵌套await。