旅行社手机网站建设方案,软文的本质是什么,建设英语网站目的,山西响应式网站建设制作“python 异步读取文件#xff0c;速度变快了吗”
当我问出这个问题#xff0c;大部分人第一反应应该是python新人#xff0c;不懂异步
首先说一下我对异步的理解#xff1a;
asyncio 是 gevent greenlet 的组合gevent 底层使用了libev、selectors 模块#xff0c;这两…“python 异步读取文件速度变快了吗”
当我问出这个问题大部分人第一反应应该是python新人不懂异步
首先说一下我对异步的理解
asyncio 是 gevent greenlet 的组合gevent 底层使用了libev、selectors 模块这两个模块是检测io操作的selectors 调用了c函数select()是io多路复用的其中一个参数的fds就是等待多个文件就绪也就是进行多个io等待gevent用greenlet切换协程任务用的
贴一个select模块的地址select --- 等待 I/O 完成 — Python 3.13.0rc2 文档
白话多个协程任务的io等待是可以同时进行的因此减少了程序运行的总时间
asyncio的教程大致两个示例
1.asyncio.sleep(delay)
2.requests.get(url)
没毛病时间确实减少了但是网上没看到文件读取的示例最后说 你们看用了异步方式读取文件时间减少了。测试一下
case1文件大小500kb数量3个
case2文件大小500kb数量500个
case3文件大小80Mb数量3个
case4文件大小80Mb数量500个
经过我的测试以上4个case情况一样异步没有减少读取时间那就用case3作为例子
异步方式读取文件
jmeter.log 文件大小80Mb数量3个
async def read_file_async(file_path):print(fstart read {file_path})async with aiofiles.open(file_path, r) as f:content await f.read()print(fread finish)async def main():files [jmeter.log,jmeter.log,jmeter.log]now lambda : time.time()start now()task_list [read_file_async(file) for file in files]await asyncio.gather(*task_list)print(now()-start)asyncio.run(main())
运行结果
start read jmeter.log start read jmeter.log start read jmeter.log read finish read finish read finish 0.25398802757263184
速度没有加快 接下来的问题什么原因呢我的答案是 我也不清楚
其实我试了asyncio、gevent、多线程、多进程、同步读取比较下来只有多进程会减少时间
不过不用担心文件读取速度很快一般情况不用考虑文件读取速度真想提高有人跟我说买更贵的ssd