创建协程、事件和消息驱动的事务
1. 异步编程基础
FastAPI框架是一个异步框架,它运行在 asyncio
平台上,并使用ASGI协议。它以100%支持异步端点和非阻塞任务而闻名。本章将详细介绍如何使用异步任务以及事件驱动和消息驱动的事务来创建高度可扩展的应用程序。
1.1 实现协程
在FastAPI框架中,线程池始终存在,用于执行每个请求的同步API和非API事务。理想情况下,当这些事务对CPU密集型和I/O密集型事务的性能开销都很小的时候,使用FastAPI框架的总体性能仍然优于那些使用非ASGI平台的框架。然而,当由于高CPU密集型流量或繁重的CPU工作负载而发生竞争时,由于线程切换,FastAPI的性能开始下降。
线程切换 是在同一进程内从一个线程切换到另一个线程的上下文切换。因此,如果有多个不同工作负载的事务在后台和浏览器上运行,FastAPI将在线程池中运行这些事务,并进行多次上下文切换。这种场景会导致竞争和对较轻工作负载的性能下降。为了避免性能问题,我们采用协程切换而不是线程。
1.2 应用协程切换
FastAPI框架通过一种称为协程切换的机制以最佳速度运行。这种方法允许事务调整任务通过允许其他正在运行的进程暂停,以便线程可以执行并完成更紧急的任务,并在不抢占线程的情况下恢复“等待”的事务。这些协程切换是程序员定义的组件,与内核或内存功能无关。在FastAPI中,实现协程有两种方式:
- 使用
@asyncio.coroutine
装饰器