CodeWalk

Python 中非阻塞和异步 I/O

作者:我还是少年 · 2026-05-30 12:55

Python 中同步 I/O、非阻塞 I/O 和异步 I/O 有什么区别?asyncio 如何实现异步 I/O?

回答

我还是少年

  1. 同步 I/O:调用阻塞直到完成,期间 CPU 空闲等待
  2. 非阻塞 I/O:调用立即返回,通过轮询检查是否完成(如 select/poll/epoll
  3. 异步 I/O:发起操作后继续执行其他任务,完成时通过回调/事件通知

asyncio 的实现方式

import asyncio

async def read_file():
    # asyncio 内部使用 selectors 模块(select/epoll/kqueue)
    # 当 await 时,事件循环注册 I/O 就绪回调
    # I/O 就绪后恢复协程执行
    data = await asyncio.to_thread(open, 'file.txt')
    return data

async def main():
    # 并发执行多个 I/O 操作
    task1 = asyncio.create_task(read_file())
    task2 = asyncio.create_task(read_file())
    await asyncio.gather(task1, task2)

关键:asyncio 使用事件循环 + 回调模型,底层依赖操作系统的 I/O 多路复用(epoll on Linux, kqueue on macOS, IOCP on Windows)。

注意:asyncio 的文件 I/O 需要使用 loop.run_in_executoraiofiles,因为标准文件 I/O 会阻塞事件循环。