我有以下代码
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
而some_func
执行,一旦执行完毕,它将停止打印while循环。我看到的输出是:
0
1
2
Some Func
我希望数字即使some_func
完成也能继续打印。
0
1
2
Some Func
3
4
5
6
.
.
.
获得更多号码的唯一方法是some_func
再次拨打电话。
我希望数字即使
some_func
完成也能继续打印。
用于run_until_complete
控制事件循环运行时间的参数。一旦事件循环停止运行,所有协程将被有效挂起,而不仅仅是您一直在等待的协程。但是您确实有不同的选择:
loop.run_until_complete(some_func())
-您已经使用的内容;运行事件循环,直到some_func
协程结束。在此期间,还可以并行执行其他协程,但是一旦事件循环结束,也将立即停止执行它们。
loop.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()))
运行事件循环,直到两个指定的协程完成。这(等待所有任务)显然是您希望loop.run_until_complete()
自动执行的操作,即使您只命名了一个,除了它不能那样工作之外,它会在指定的协程完成后立即停止。asyncio.gather
可用于一次等待多个协程。有关等待的更精细控制,请参见asyncio.wait
。
由于协程中的一个永远运行,因此最后两个选项将等效,并会产生预期的输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句