Python aiohttp异步请求

requests只能发送同步请求;
aiohttp 只能发送异步请求;
httpx既能发送同步请求,又能发送异步请求。

本地测试:批量下载78张图(线上环境稍快些):
  • 同步下载: requests大概40s。
    • 改进:用requests.post每次都会创建新连接,速度较慢。而如果首先初始化一个 Session,那么 requests 会保持连接,从而大大提高请求速度。
  • 异步下载:requests大概18s.
  • 异步下载:asyncio大概12s.

用asyncio.gather执行,前期速度慢…???
在这里插入图片描述

aiohttp异步请求

安装:pip3 install aiohttp

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url, verify_ssl=False) as response:
        content = await response.content.read()
        filename = url.rsplit('_')[-1]
        with open(filename, 'wb') as f:
            f.write(content)
            
            
async def main():
	urls = ['https://XXX/2.jpg', 'https://XXX/1.jpg']
	
    async with aiohttp.ClientSession() as session:
        await asyncio.gather(*[asyncio.create_task(fetch(session, url)) for url in urls]


if __name__ == '__main__':
    asyncio.run(main())   
限制并发数

3.6.8 支持asyncio.ensure_future,不支持asyncio.create_task
asyncio中用到select,而select是系统IO多路复用的一种方式,它会限制单个进程打开文件描述符的数量(linux是1024个,window是509个),如果超出这个值程序就会报错ValueError: too many file descriptors in select(),.

解决方案:

  • asyncio.Semaphore类是同步装置,用于限制并发请求
  • async with 是异步上下文管理器.

上下文管理协议:当使用with语句时,解释器会自动调用 __enter__,__exit__

semaphore = asyncio.Semaphore(500)

async def request():
    async with semaphore:
        url = 'http://127.0.0.1:5000'
        result = await get(url)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值