趋近智
"虽然核心机器学习推理步骤通常受限于 CPU,但许多 ML API 工作流涉及大量的输入/输出 (I/O) 操作。这些操作可能包括从远程数据库获取特征数据、从另一个微服务检索用户配置文件、加载配置文件,或将预测日志保存到存储设备。当同步执行时,这些 I/O 任务会成为主要的性能瓶颈。"
考虑一个典型的 API 请求,它在运行预测前需要获取数据:
在传统的同步框架中,如果步骤 2 涉及等待数据库 100 毫秒,处理该请求的工作进程将完全阻塞。在该等待期间,它无法处理任何其他传入请求。同样,在步骤 6 中,工作进程再次阻塞,等待存储操作完成。如果您的 API 收到许多并发请求,大多数工作进程可能只是在等待 I/O,导致高延迟和低吞吐量。
这就是异步编程的优势所在。通过使用 async def 定义您的路由处理程序,并在调用 I/O 密集型函数时使用 await(由兼容异步的库提供,例如用于 HTTP 请求的 httpx、用于数据库访问的 asyncpg 或 databases、用于文件系统操作的 aiofiles),您就可以让 FastAPI 的事件循环有效管理这些等待时间。
当 I/O 操作遇到 await 时(例如 await database.fetch_one(...) 或 await http_client.get(...)),函数会暂停在该点的执行。然而,重要的是,工作进程不会阻塞。事件循环可以切换上下文,并使用工作进程处理其他就绪任务,例如处理不同的传入请求,或继续执行已完成 I/O 等待的其他异步函数。一旦原始 I/O 操作完成(例如,数据库返回数据),事件循环就会从暂停的地方恢复已暂停的函数。
同步和异步 I/O 处理的对比。同步工作进程按顺序处理请求,并在每次 I/O 等待时阻塞。异步工作进程可以启动多个 I/O 操作,并在 I/O 完成时在处理任务之间切换,从而提高整体吞吐量。
在您的 ML API 中将异步操作用于 I/O 密集型任务的主要优点包括:
需要记住的是,async/await 主要对 I/O 密集型操作有益。对于像实际模型推理这样的 CPU 密集型任务,单独使用异步定义并不能阻止事件循环的阻塞。正如之前讨论的,run_in_threadpool 等技术对于卸载这些密集计算是必要的,通常需要结合用于周边 I/O 操作的异步封装器。通过将异步 I/O 处理与针对 CPU 密集型工作的适当策略结合起来,您可以为您的机器学习模型构建高度响应且可扩展的 FastAPI 应用程序。
这部分内容有帮助吗?
async/await 如何管理I/O等待。asyncio 库构建并发应用的全面指南,清晰解释事件循环、协程和I/O管理。© 2026 ApX Machine Learning用心打造