Python3.7,异步/等待打印顺序错误

2024-03-29 10:00:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在测试Python3.7的异步/等待函数,并编写了如下简单代码:

import asyncio
import time


async def first():
    print('FIRST')


async def second():
    time.sleep(2)
    print('SECOND')


async def main():
    asyncio.create_task(second())
    asyncio.create_task(second())
    asyncio.create_task(second())
    asyncio.create_task(first())
    asyncio.create_task(first())
    asyncio.create_task(first())

asyncio.run(main())

当我运行此代码时,它会打印以下内容:

SECOND
SECOND
SECOND
FIRST
FIRST
FIRST

这不是我所期望的。我认为FIRST应该先打印,因为它们没有延迟。但是,create_task在继续执行文本异步任务之前,将等待second()完成

是否可以执行异步任务而不让它们彼此等待


Tags: 函数代码importasynciotaskasynctimemain
2条回答

不能使用time.sleep()函数,因为它不是异步的,导致整个程序实际处于休眠状态。使用asyncio.sleep()函数并等待它以使其异步运行:

import asyncio


async def first():
    print('FIRST')


async def second():
    # The Fix:
    await asyncio.sleep(2)
    print('SECOND')


async def main():
    await asyncio.gather(
        second(),
        second(),
        second(),
        first(),
        first(),
        first()
    )

if __name__ == '__main__':
    asyncio.run(main())

结果应该是:

FIRST
FIRST
FIRST
SECOND
SECOND
SECOND

您必须使用gather()函数并稍微修改代码。您还必须使用await关键字

import asyncio
import time


async def first():
    print('FIRST')
    await asyncio.sleep(1)
    print('SECOND')


async def main():
    await asyncio.gather(first(), first(), first())

asyncio.run(main())

相关问题 更多 >