【发布时间】:2018-01-01 06:17:04
【问题描述】:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import asyncio,time
async def asleep(n):
time.sleep(n) # blocking method
async def doAsync(n):
print("doAsync{} start...".format(n))
await asleep(2) # case 1
#await asyncio.gather(asleep(2)) # case 2
print("doAsync{} end...".format(n))
#...
tasks = [doAsync(i) for i in range(1,4)]
tasks = [asyncio.ensure_future(t) for t in tasks]
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
输出:
## case 1 output # No concurrency runs
doAsync1 start...
(wait 2 seconds)
doAsync1 end...
doAsync2 start...
(wait 2 seconds)
doAsync2 end...
doAsync3 start...
(wait 2 seconds)
doAsync3 end...
## case 2 output # Concurrency runs
doAsync1 start...
doAsync2 start...
doAsync3 start...
(wait 2*3 seconds)
doAsync1 end...
doAsync2 end...
doAsync3 end...
案例一:
虽然 sleep() 也是协程,
但是 doAsync 没有在“等待睡眠()”处挂起
doAsync 没有实现并发
案例2:
doAsync 是并发的
问题:
- 如何详细解释它的工作原理。
- 什么时候应该使用“await some_work()”,什么时候应该使用“await asyncio.gather(some_work)”
【问题讨论】:
标签: python python-asyncio coroutine