关于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执行完毕")
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()
等方式将协程交给事件循环并行调度,才能真正实现并发。