Python 中非阻塞和异步 I/O
Python 中同步 I/O、非阻塞 I/O 和异步 I/O 有什么区别?asyncio 如何实现异步 I/O?
回答
我还是少年
- 同步 I/O:调用阻塞直到完成,期间 CPU 空闲等待
- 非阻塞 I/O:调用立即返回,通过轮询检查是否完成(如
select/poll/epoll) - 异步 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_executor 或 aiofiles,因为标准文件 I/O 会阻塞事件循环。