import asyncio
"""
在这个例子中,main()方法使用asyncio.ensure_future()方法创建了两个任务,
然后将它们放入了一个列表中。最后,通过在asyncio.gather()方法前加上*,
将列表中的任务解包为单独的参数,然后同时运行这些任务。
注意,asyncio.ensure_future()方法会将协程包装为一个Task对象,
这个对象可以用于取消协程或获取协程的状态。
"""
async def coroutine1():
await asyncio.sleep(1)
print("Hello from coroutine 1!")
async def coroutine2():
await asyncio.sleep(2)
print("Hello from coroutine 2!")
async def main():
tasks = [
asyncio.ensure_future(coroutine1()),
asyncio.ensure_future(coroutine2())
]
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
# 程序遇见了io操作阻塞,可以选择性切换到其他任务上
# 在微观上是一个任务一个任务的切换, 宏观上多个任务一起执行
# 多任务异步操作
# 都是在单线程的条件下
# ==========================
# 实现协程
import time
import asyncio
async def fun():
print("你好")
async def fun1():
print("你好1")
await asyncio.sleep(4)
print("你好1")
async def fun2():
print("你好2")
await asyncio.sleep(2)
print("你好2")
async def fun3():
print("你好3")
await asyncio.sleep(3)
print("你好3")
async def m():
# 运行多个协程
task1 = asyncio.ensure_future(fun1())
task2 = asyncio.ensure_future(fun2())
task3 = asyncio.ensure_future(fun3())
await asyncio.gather(task1, task2, task3)
if __name__ == '__main__':
"""
python3.7之后
此时的函数是异步协程对象
g = fun()
运行协程对象方法如下
asyncio.run(g)
py3.7
f1 = fun1()
f2 = fun2()
f3 = fun3()
tasks = [f1, f2, f3]
asyncio.run(asynico.wait(tasks))
"""
# py3.6之前
asyncio.get_event_loop().run_until_complete(fun())
"""
await 放在协程对象前面
"""
t1 = time.time()
asyncio.get_event_loop().run_until_complete(m())
t2 = time.time()
print(t2 - t1)
py3.6版本实现方式和3.7之后的不一样
# py3.6
# requests.get() -》 异步aiohttp
# pip install aiohttp
import aiohttp
import asyncio
urls = [
"http://kr.shanghai-jiuxin.com/file/bizhi/20220928/z2m1usr0hmz.jpg",
"http://kr.shanghai-jiuxin.com/file/bizhi/20220928/mqrztqlvan3.jpg",
"http://kr.shanghai-jiuxin.com/file/bizhi/20220928/htjizl5epz5.jpg"
]
async def download(url):
name = url.rsplit("/", 1)[1]
# 从右边切, with封装了close
async with aiohttp.ClientSession() as Session:
async with Session.get(url) as resp:
"""
resp.content.read()
resp.json()
resp.text() => requests,resp.text
"""
with open("../images/"+name, mode="wb") as f:
f.write(await resp.content.read())
print("搞定")
async def main():
tasks = []
for url in urls:
tasks.append(asyncio.ensure_future(download(url)))
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())