目录
平常使用的file操作模式为同步,并且为线程阻塞。当程序I/O并发次数高的时候,CPU被阻塞,形成闲置。现在我总结下目前python3.6以后的异步使用文件解决方案:
线程开启文件读取异步模式
用线程(Thread)方式来解决。硬盘缓存可以被多个线程访问,因此通过不同线程访问文件可以部分解决。但此方案涉及线程开启关闭的开销,而且不同线程间数据交互比较麻烦。
from threading import Thread
for file in list_file:
tr = Thread(target=file.write, args=(data,))
tr.start()
使用已编写好的第三方插件-aiofiles,支持异步模式
使用aio插件来开启文件的非阻塞异步模式。
安装方法
pip install aiofiles
这个插件的使用和python原生open 一致,而且可以支持异步迭代:
打开文件
import aiofiles
async with aiofiles.open('filename', mode='r') as f:
contents = await f.read()
print(contents)
'My file contents'
迭代,Asynchronous iteration
import aiofiles
async with aiofiles.open('filename') as f:
async for line in f:
print(line)
插件可支持的属性
插件和file的api属性一样
- close
- flush
- isatty
- read
- readall
- read1
- readinto
- readline
- readlines
- seek
- seekable
- tell
- truncate
- writable
- write
- writelines
参考
aiofiles:https://github.com/Tinche/aiofiles/
asyncio filesystem进展:https://github.com/python/asyncio/wiki/ThirdParty#filesystem