学习aiohttp模块中遇到的问题及解决方案

#requests.get() 同步的代码--> 异步操作aiohttp


import aiohttp
import asyncio
from time import time
# s = aiohttp.ClientSession()  <==>requests
# requests.get()  .post()
# s.get()   .post()
# 发送请求
# 得到图片内容
# 保存到文件
if __name__ == '__main__':
    start=time()
    try:
        async def aiodownload(url):
            name = url.rsplit("/",1)[1]  #反着进行split操作 1次 r=reverse
            async with aiohttp.ClientSession() as session: #通过aiohttp模块进行异步操作 requests是同步的 会使异步操作中断 返回一个session对象 | with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。
               # 我们创建了一个 ClientSession 对象命名为session,

                 async with session.get(url) as resp:     # 然后通过session的get方法得到一个 ClientResponse 对象 命名为resp
                     # get方法中传入了一个必须的参数url,就是要获得源码的http url。
                     # 至此便通过协程完成了一个异步IO的get请求。

                     #请求回来了 写入文件
                     with open(name,mode="wb") as f:
                          f.write(await resp.content.read())   #读取内容是异步的 需要await挂起
            #text()返回字符串形式的响应数据
            #read()返回的是二进制的相应数据
            #json()返回的就是json对象

            print(name,"done")
        tasks=[]
        async def main():
            urls = {
                "https://alifei04.cfp.cn/creative/vcg/800/new/VCG211181795397-RVN.jpg",
                "https://alifei03.cfp.cn/creative/vcg/800/new/VCG211178401745-RDE.jpg",
                "https://alifei04.cfp.cn/creative/vcg/800/new/VCG21gic18813738-KOC.jpg"
            }
            for url in urls:
               task=asyncio.create_task(aiodownload(url))
               tasks.append(task)
            await asyncio.wait(tasks)
    except Exception as msg:
           print(msg)
loop=asyncio.get_event_loop()
loop.run_until_complete((main()))
print(time()-start)
##若将上面两行换成asyncio.run() 则会报如下错
"""RuntimeError: Event loop is closed"""
#因为asyncio.run()会自动关闭循环
#并且调用_ProactorBasePipeTransport.__del__报错
#而asyncio.run_until_complete()就不会自动关闭循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值