【问题标题】:understanding asyncio await behaviour了解异步等待行为
【发布时间】:2020-03-04 01:58:16
【问题描述】:

我有以下示例代码:

from datetime import datetime
import asyncio

async def h():
    print("h() has started")
    await asyncio.sleep(5)
    print("h() has ended")

async def main():
    print("{}: start of program".format(datetime.now()))
    await h()
    print("{}: end of program".format(datetime.now()))

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

我本来希望(并且希望代码的输出)是以下几行:

2020-03-03 17:31:25.379742: start of program
h() has started
2020-03-03 17:31:30.384977: end of program
h() has ended

但是我有以下输出:

2020-03-03 17:31:25.379742: start of program
h() has started
h() has ended
2020-03-03 17:31:30.384977: end of program

是否有具体原因说明为什么会发生这种情况以及我如何才能达到预期的结果?

【问题讨论】:

    标签: python-asyncio


    【解决方案1】:

    等待协程(如h())的全部意义在于等待让它完成,并(在有意义的情况下)访问它的返回值。例如,line = await stream.readline() 暂停当前协程直到 readline() 完成,然后提供结果分配给 line

    如果您希望h() 在后台运行,您可以使用asyncio.create_task 代替。但它仍然不会产生所需的输出,因为run_until_complete(main()) 只等待main() 完成,而忽略它可能产生的其他任务。 (它还返回协程的返回值,很像 await 的同步等价物。)

    如果您想等待其他任务,您必须明确说明。也许是这样的:

    async def main():
        bgtasks = []
        print("{}: start of program".format(datetime.now()))
        bgtasks.append(asyncio.create_task(h()))
        print("{}: end of program".format(datetime.now()))
        return bgtasks
    
    async def run_everything():
        more_tasks = await main()
        await asyncio.gather(*more_tasks)
    
    if __name__ == '__main__':
        asyncio.run(run_everything())
    

    【讨论】:

    • @Nilzy123 不客气!如果问题现在得到解决,请随时accept the answer
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多