Python中aiofiles库的意义与使用场景是什么?

https://github.com/Tinche/aiofiles
今天蛋疼的看了一眼,发现它把文件操作扔到 asnycio 里面,但是文件的读写模式仍然是 block 的。搞不懂这么干到底有什么意义。我是 python 小白,还请指教一下。
Python中aiofiles库的意义与使用场景是什么?

9 回复

不就是封装一个线程池吗?这个不会堵塞主线程,就是这样


aiofiles 这库主要解决异步编程里文件I/O的阻塞问题。Python自带的asyncio只处理网络I/O异步化,但普通文件操作还是会阻塞事件循环。aiofiles给open()、read()、write()这些操作提供了异步版本。

典型使用场景就是异步Web服务器(比如FastAPI、aiohttp)里需要读写文件的时候。比如用户上传文件,你用同步方式保存就会卡住整个服务,用aiofiles就能边存文件边处理其他请求。

看个具体例子:

import aiofiles
import asyncio

async def async_write():
    async with aiofiles.open('test.txt', 'w') as f:
        await f.write('Hello async world!')

async def async_read():
    async with aiofiles.open('test.txt', 'r') as f:
        content = await f.read()
        print(content)

async def main():
    await async_write()
    await async_read()

asyncio.run(main())

API设计和内置的open几乎一样,就是把with语句和读写方法前面加上async/await。还支持逐行读取、追加模式这些常见操作。

简单说就是让文件操作不拖累异步程序的并发性能。

,对 asyncio 不太了解,我猜测它是用了一个单独线程执行所有协程工作。这样有大量文件 IO 时应该并没有带来多大好处,不过是把阻塞放到另一个线程了。我觉得这个库应该使用 epoll 类的异步 API ,才能完全发挥 asyncio 的优势,但是看看代码好像并没有。

epoll 不支持本地 IO,非堵塞只是指不堵塞主线程,除非 Windows ,要不然你要完全用户态线程不堵塞是做不到的,那需要的是异步 IO 接口,内核不支持都没有用

POSIX 不是有 aio 么
用的是 coroutine 。但是不会阻塞啊。非阻塞的方法有很多, select poll aio 都行

epoll 在这里确实不适合,见笑了
coroutine 里面调用系统的阻塞 API ,还是要阻塞的吧。我觉得这个库应该用你说的这几个非阻塞 API ,但翻了半天代码它的确是用的最普通的阻塞方法。

你到 stackoverflow 搜搜文件异步 io 的实现方式,线程池是比较简单方便而且平台兼容性比较好的做法。

现在的 aio 都是线程实现的。。。

感觉没什么意义, 之前测试了一下, 读 100 个文件, aiofiles 比普通的方式还要更慢

回到顶部