asyncio总结

关于yield的理解

1
2
n = yield r
可以理解为r是生成器返回的,当调用send(5)的时候,会把5传递给yield,然后赋值给生成器内部的n

如何精确控制 asyncio 中并发运行的多个任务-阿里云开发者社区

python asyncio的误区

  • 如果单纯的只用await,实际上是同步,会阻塞,直到await后面的任务完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import asyncio
import time

# 定义两个协程
async def task1():
print("任务1开始执行")
await asyncio.sleep(2) # 模拟耗时操作
print("任务1执行完毕")

async def task2():
print("任务2开始执行")
await asyncio.sleep(1) # 模拟耗时操作
print("任务2执行完毕")

async def main():
t1 = time.time()
await task1()
await task2()

t2 = time.time()
print("Total time:", t2 - t1)

# 运行主函数
if __name__ == "__main__":
asyncio.run(main())

  • 真正的异步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import asyncio
import time

# 定义两个协程
async def task1():
print("任务1开始执行")
await asyncio.sleep(2) # 模拟耗时操作
print("任务1执行完毕")

async def task2():
print("任务2开始执行")
await asyncio.sleep(1) # 模拟耗时操作
print("任务2执行完毕")

# 主协程,使用create_task并发执行两个任务
async def main():
print("主协程开始执行")
t1 = time.time()
# 创建任务
task_1 = asyncio.create_task(task1())
task_2 = asyncio.create_task(task2())
# 等待所有任务完成
await asyncio.gather(task_1, task_2)
t2 = time.time()
print("Total time:", t2 - t1)

print("主协程执行完毕")

# 运行主协程
asyncio.run(main())

  • 仅用 await 顺序调用协程时,代码会像同步一样串行执行
  • 只有通过 asyncio.gather()create_task() 等方式将协程交给事件循环并行调度,才能真正实现并发。