asyncio模块和aiohttp模块

 

 二、阻塞和await

普通串行花费7秒多
async def func1():
print("你好啊, 我叫潘金莲")
# time.sleep(3) # 当程序出现了同步操作的时候. 异步就中断了
await asyncio.sleep(3) # 异步操作的代码
print("你好啊, 我叫潘金莲")


async def func2():
print("你好啊, 我叫王建国")
# time.sleep(2)
await asyncio.sleep(2)
print("你好啊, 我叫王建国")


async def func3():
print("你好啊, 我叫李雪琴")
await asyncio.sleep(4)
print("你好啊, 我叫李雪琴")


if __name__ == '__main__':
f1 = func1()
f2 = func2()
f3 = func3()
tasks = [
f1, f2, f3
]
t1 = time.time()
# 一次性启动多个任务(协程)
asyncio.run(asyncio.wait(tasks))
t2 = time.time()
print(t2 - t1)
console:

你好啊, 我叫李雪琴
你好啊, 我叫潘金莲
你好啊, 我叫王建国
你好啊, 我叫王建国
你好啊, 我叫潘金莲
你好啊, 我叫李雪琴
4.019769191741943

进程已结束,退出代码0

协程并发只花费4秒

async def func1():
print("你好啊, 我叫潘金莲")
await asyncio.sleep(3)
print("你好啊, 我叫潘金莲")


async def func2():
print("你好啊, 我叫王建国")
await asyncio.sleep(2)
print("你好啊, 我叫王建国")


async def func3():
print("你好啊, 我叫李雪琴")
await asyncio.sleep(4)
print("你好啊, 我叫李雪琴")


async def main():
# 第一种写法
# f1 = func1()
# await f1 # 一般await挂起操作放在协程对象前面
# 第二种写法(推荐)
tasks = [
asyncio.create_task(func1()), # py3.8以后加上asyncio.create_task()
asyncio.create_task(func2()),
asyncio.create_task(func3())
]
await asyncio.wait(tasks)


if __name__ == '__main__':
t1 = time.time()
# 一次性启动多个任务(协程)
asyncio.run(main())
t2 = time.time()
print(t2 - t1)
console:

你好啊, 我叫潘金莲
你好啊, 我叫王建国
你好啊, 我叫李雪琴
你好啊, 我叫王建国
你好啊, 我叫潘金莲
你好啊, 我叫李雪琴
4.010734558105469

三、aiohttp模块

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

import asyncio
import aiohttp

urls = [
"http://kr.shanghai-jiuxin.com/file/2020/1031/191468637cab2f0206f7d1d9b175ac81.jpg",
"http://kr.shanghai-jiuxin.com/file/2020/1031/563337d07af599a9ea64e620729f367e.jpg",
"http://kr.shanghai-jiuxin.com/file/2020/1031/774218be86d832f359637ab120eba52d.jpg"
]


async def aiodownload(url):
# 发送请求.
# 得到图片内容
# 保存到文件
name = url.rsplit("/", 1)[1] # 从右边切, 切一次. 得到[1]位置的内容
async with aiohttp.ClientSession() as session: # requests
async with session.get(url) as resp: # resp = requests.get()
# 请求回来了. 写入文件
# 可以自己去学习一个模块, aiofiles
with open(name, mode="wb") as f: # 创建文件
f.write(await resp.content.read()) # 读取内容是异步的. 需要await挂起, resp.text()

print(name, "搞定")


async def main():
tasks = []
for url in urls:
tasks.append(aiodownload(url))

await asyncio.wait(tasks)


if __name__ == '__main__':
asyncio.run(main())

 

 

 
posted @ 2022-10-31 18:51  guorunbin  阅读(21)  评论(0编辑  收藏  举报