import asyncio
import time
async def say_after(delay, what):
print(f'[%s]: starting %s' % (time.time(), what))
await asyncio.sleep(delay)
print(f'[%s]: ending %s' % (time.time(), what))
async def main():
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after(2, 'world'))
task3 = asyncio.create_task(
say_after(0.5, 'Hai')
)
print(f"started at {time.strftime('%X')}")
# Wait until both tasks are completed (should take
# around 2 seconds.)
await task1
# await task2
print(f"finished at {time.strftime('%X')}")
if __name__ == '__main__':
asyncio.run(main())
started at 11:49:41
[1691380181.884058]: starting hello
[1691380181.884095]: starting world
[1691380181.884105]: starting Hai
[1691380182.385623]: ending Hai
[1691380182.885086]: ending hello
finished at 11:49:42
create_task 会顺序把三个任务放入队列。
await 相当于一把发令枪,trigger 一下,三个任务顺序开始执行。
如果此时,在 await task1 之后,再 sleep 一下,就能看到执行时间最长的那个任务也结束了。
import asyncio
import time
async def say_after(delay, what):
print(f'[%s]: starting %s' % (time.time(), what))
await asyncio.sleep(delay)
print(f'[%s]: ending %s' % (time.time(), what))
async def main():
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after(2, 'world'))
task3 = asyncio.create_task(
say_after(0.5, 'Hai')
)
print(f"started at {time.strftime('%X')}")
# Wait until both tasks are completed (should take
# around 2 seconds.)
await task1
# await task2
await asyncio.sleep(2)
print(f"finished at {time.strftime('%X')}")
if __name__ == '__main__':
asyncio.run(main())
started at 11:56:07
[1691380567.491296]: starting hello
[1691380567.491312]: starting world
[1691380567.491318]: starting Hai
[1691380567.992693]: ending Hai
[1691380568.4926028]: ending hello
[1691380569.492554]: ending world
finished at 11:56:10
应该把这里的 create_task, await 比作 socket 中的 write 和 flush 操作来理解,或者写日志中的 write 和 flush 操作。
