• 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 中的 writeflush 操作来理解,或者写日志中的 writeflush 操作。