我有以下代码
import asyncio
loop = asyncio.get_event_loop()
async def while_loop():
n = 0
while True:
print(f"{n}")
await asyncio.sleep(2)
n = n+1
async def some_func():
await asyncio.sleep(5)
print("Some Func")
future = loop.create_task(while_loop())
loop.run_until_complete(some_func())
我预计while_loop
函数永远运行,但它似乎只是作为调用的结果执行run_until_complete
并且它停止打印 while 循环一次some_func
执行完毕。我看到的输出是:
0
1
2
Some Func
我预计这些数字即使在之后也会继续打印some_func
完成了。
0
1
2
Some Func
3
4
5
6
.
.
.
打印更多号码的唯一方法是致电some_func
again.
我预计这些数字即使在之后也会继续打印some_func
完成了。
论点为run_until_complete
控制事件循环运行的时间。一旦事件循环停止运行,all协程实际上被挂起,而不仅仅是您一直在等待的那个。但你确实有不同的选择:
loop.run_until_complete(some_func())
- 您已经使用过的;运行事件循环直到some_func
协程结束。在此期间也并行执行其他协程,但也会在事件循环完成后立即停止执行它们。
loop.run_forever() https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.run_forever- 运行事件循环,直到调用某些协程或回调loop.stop()
。如果它们都不这样做,那么即使所有协程都结束,事件循环也不会停止。在你的情况下你会打电话loop.create_task(while_loop())
其次是loop.create_task(some_func())
进而loop.run_forever()
.
loop.run_until_complete(asyncio.gather(while_loop(), some_func()))
运行事件循环直到both指定的协程完成。这个(等all任务)显然是你所期望的loop.run_until_complete()
即使您只命名一个,也会自动执行,但它不会像那样工作,一旦指定的协程完成,它就会停止。asyncio.gather https://docs.python.org/3/library/asyncio-task.html#asyncio.gather可用于同时等待多个协程。有关等待的更精细控制,另请参阅asyncio.wait https://docs.python.org/3/library/asyncio-task.html#asyncio.wait.
由于您的协程之一会永远运行,因此最后两个选项将是等效的,并将产生预期的输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)