`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__")
得到这个输出:
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 设施像 gather
or wait
(the difference is described )。否则,它们将在退出主协程时被 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__
我 运行 这个代码在 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__")
得到这个输出:
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 设施像 gather
or wait
(the difference is described 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__