把就绪的工作交回程序

异步程序需要有人决定何时继续一个暂停的活动。事件循环把I/O相关事件、待运行回调和任务等工作连接起来,在适当时机执行对应处理,而不是让应用为每次等待都停住整个处理流程。

Python的asyncio事件循环提供运行任务、安排回调、建立网络连接和运行子进程等接口。它是运行系统的协调部分;使用协程语法与存在一个实际负责推进它的调度环境,是相互配合的两件事。

参考:[1] [2]

回调与定时器遵守各自规则

安排一个回调并不等于当场执行它。asyncio的call_soon把回调加入后续循环调度,并按注册次序运行相应回调;从另一线程提交工作则需要适当的线程安全接口。

延迟回调使用事件循环的时间基准,asyncio采用单调时钟追踪时间。相同目标时刻的回调没有固定先后保证,时钟精度与循环负载也影响实际执行时机;定时安排不能被理解为独占处理器的实时截止承诺。

参考:[1]

事件驱动仍会被长工作阻塞

在同一循环线程上长时间计算,或者直接执行阻塞文件操作,会推迟其他回调和任务获得处理的机会。并发任务很多,也不表示这些任务已经在多个处理器上并行执行。

asyncio允许把适合的工作交给线程或进程执行器,再用异步结果连接回循环。这样的分工需要同时考虑任务数量、外部资源和返回结果的处理;仅给函数加上异步外壳,不会消除其内部的阻塞行为。

参考:[1] [3]