#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()就不会自动关闭循环。
学习aiohttp模块中遇到的问题及解决方案
最新推荐文章于 2023-04-24 13:09:48 发布