java中的接口是类吗
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~