python 协程asyncio使用
环境
协程声明
通过async/await 语法进行声明
import asyncio
import threading
async def test(num):
ident = threading.get_ident()
print(f"{ident}start | {num}")
await asyncio.sleep(5)
print(f"{ident}end | {num}")
return num
可await对象
await关键字后面并不是所有都能放的,能放以下三种对象:
- 协程(通过async定义的函数)
- Further对象
- Task对象
协程运行方式
用关键字async 定义的方法已经无法通过方法名()来执行。只能通过asyncio.run()执行。通常定义一个入口main函数来调用定义的协程函数,然后通过asyncio.run() 执行。 比如调用上面的test方法:
res = asyncio.run(test(1))
以上有个注意点,asyncio.run是>=3.7版本新加的,以前的版本需要开启一个roop
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([test(1)]))
loop.close()
异步、并发执行多个任务
async def main():
task1 = asyncio.create_task(test(1))
task2 = asyncio.create_task(test(2))
task3 = asyncio.create_task(test(5))
r1 = await task1
r2 = await task2
r3 = await task3
async def main():
await asyncio.gather(test(1), test(2), test(3))
from asyncio import Task
async def main():
done, pending = await asyncio.wait({test(1), test(3)}, timeout=2)
协程的同步调用
async def main():
r1 = await test(1)
r2 = await test(2)
|