簡體   English   中英

`asyncio.run()` 不等待協程完成

[英]`asyncio.run()` does not wait for coroutine to finish

我在 Python 3.7.3 中運行此代碼

import asyncio

async def fun(time):
    print(f"will wait for {time}")
    await asyncio.sleep(time)
    print(f"done waiting for {time}")

async def async_cenas():
    t1 = asyncio.create_task(fun(1))
    print("after 1")
    t2 = asyncio.create_task(fun(2))
    print("after 2")

def main():
    t1 = asyncio.run(async_cenas())
    print("ok main")
    print(t1)

if __name__ == '__main__':
    main()
    print("finished __name__")

並得到這個 output:

after 1
after 2
will wait for 1
will wait for 2
ok main
None
finished __name__

我還期待看到:

done waiting for 1
done waiting for 2

即,為什么期望asyncio.run(X)在繼續之前等待協程完成。

如果您想等待create_task生成的所有任務完成,那么您需要明確地執行此操作,例如,輪流await它們或 asyncio 工具(如gatherwait )( 此處描述了區別)。 否則,它們將在退出主協程時被asyncio.run取消,並傳遞給asyncio.run

例子:

import asyncio

async def fun(time):
    print(f"will wait for {time}")
    await asyncio.sleep(time)
    print(f"done waiting for {time}")

async def async_cenas():
    t1 = asyncio.create_task(fun(1))
    print("after 1")
    t2 = asyncio.create_task(fun(2))
    print("after 2")
    await asyncio.wait({t1, t2}, return_when=asyncio.ALL_COMPLETED)
    # or just
    # await t1
    # await t2

def main():
    t1 = asyncio.run(async_cenas())
    print("ok main")
    print(t1)

if __name__ == '__main__':
    main()
    print("finished __name__")
after 1
after 2
will wait for 1
will wait for 2
done waiting for 1
done waiting for 2
ok main
None
finished __name__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM