asyncio create_task 到 运行 永远
asyncio create_task to run forever
我有以下代码
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
。
I expected the numbers to keep printing even after some_func
is completed.
run_until_complete
的参数控制事件循环的长度运行。一旦事件循环停止 运行ning,所有 协程将有效暂停,而不仅仅是您一直在等待的协程。但是你有不同的选择:
loop.run_until_complete(some_func())
- 你已经使用过的; 运行 事件循环,直到 some_func
协程完成。在此期间也并行执行其他协同程序,但也会在事件循环完成后立即停止执行它们。
loop.run_forever()
- 运行 事件循环,直到某个协程或回调调用 loop.stop()
。如果 none 这样做,那么即使所有协程都结束,事件循环也不会停止。在你的情况下,你会调用 loop.create_task(while_loop())
,然后调用 loop.create_task(some_func())
,然后调用 loop.run_forever()
。
loop.run_until_complete(asyncio.gather(while_loop(), some_func()))
运行 事件循环直到 both 指定的协程完成。这(等待 所有 任务)显然是你期望 loop.run_until_complete()
自动执行的,即使你只命名一个,除了它不是那样工作的,它停止为一旦指定的协程完成。 asyncio.gather
can be used to wait for multiple coroutines at once. For a more fine-tuned control of waiting, also see asyncio.wait
.
由于您的协程之一 运行 永远存在,因此最后两个选项将是等效的,并将产生预期的输出。
我有以下代码
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
。
I expected the numbers to keep printing even after
some_func
is completed.
run_until_complete
的参数控制事件循环的长度运行。一旦事件循环停止 运行ning,所有 协程将有效暂停,而不仅仅是您一直在等待的协程。但是你有不同的选择:
loop.run_until_complete(some_func())
- 你已经使用过的; 运行 事件循环,直到some_func
协程完成。在此期间也并行执行其他协同程序,但也会在事件循环完成后立即停止执行它们。loop.run_forever()
- 运行 事件循环,直到某个协程或回调调用loop.stop()
。如果 none 这样做,那么即使所有协程都结束,事件循环也不会停止。在你的情况下,你会调用loop.create_task(while_loop())
,然后调用loop.create_task(some_func())
,然后调用loop.run_forever()
。loop.run_until_complete(asyncio.gather(while_loop(), some_func()))
运行 事件循环直到 both 指定的协程完成。这(等待 所有 任务)显然是你期望loop.run_until_complete()
自动执行的,即使你只命名一个,除了它不是那样工作的,它停止为一旦指定的协程完成。asyncio.gather
can be used to wait for multiple coroutines at once. For a more fine-tuned control of waiting, also seeasyncio.wait
.
由于您的协程之一 运行 永远存在,因此最后两个选项将是等效的,并将产生预期的输出。