aiohttp 异步http请求-3.异步批量下载图片

网友投稿 269 2022-09-06


aiohttp 异步http请求-3.异步批量下载图片

前言

当我们需要批量下载图片的时候,requests 库会比较慢,如果一个个下载,出现阻塞的时候,后面的都会阻塞卡住,假死状态。当然你用多线程也能提高效率。

这里介绍用aio异步批量下载图片

异步批量下载图片

话不多说,直接看代码

import aioasynciofrom pathlib import Pathasync def down_img(session, url): """下载图片""" name = url.split('/')[-1] # 获得图片名字 img = await session.get(url) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url)async def main(URL): # 建立会话session async with aioas session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) all_results = [done_task.result() for done_task in done] # 获取所有结果 print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))

运行结果

mountain-477832_960_720.jpg 下载完成!railroad-163518_960_720.jpg 下载完成!maldives-3220702_960_720.jpg 下载完成!dolomites-2580866_960_720.jpg 下载完成!pier-1467984_960_720.jpg 下载完成!plane-513641_960_720.jpg 下载完成!iceberg-404966_960_720.jpg 下载完成!sea-1014710_960_720.jpg 下载完成!ALL RESULT:[''''''''= asyncio.Semaphore(2) # 限制并发量为2

优化后的代码

import aioasynciofrom pathlib import Pathasync def down_img(session, url, semaphore): """下载图片""" async with semaphore: name = url.split('/')[-1] # 获得图片名字 img = await session.get(url) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url)async def main(URL): semaphore = asyncio.Semaphore(2) # 限制并发量为2 # 建立会话session async with aioas session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url, semaphore)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) all_results = [done_task.result() for done_task in done] # 获取所有结果 print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))

使用TCPConnector控制并发

TCPConnector 使用 limit 参数控制并发数

conn = aio # 建立会话session async with aioas session:

完成代码如下

import aioasynciofrom pathlib import Pathasync def down_img(session, url): """下载图片""" name = url.split('/')[-1] # 获得图片名字 img = await session.get(url) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url)async def main(URL): conn = aio # 建立会话session async with aioas session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) all_results = [done_task.result() for done_task in done] # 获取所有结果 print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Maven pom文件中属性变量总结
下一篇:aiohttp 异步http请求-2.post 请求application/json和application/x-www-form-urlencode
相关文章

 发表评论

暂时没有评论,来抢沙发吧~