sla*_*law 4 python python-3.x python-asyncio
我有以下代码
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())
Run Code Online (Sandbox Code Playgroud)
我希望while_loop函数永远运行,但它似乎只是作为调用的结果执行,run_until_complete并且一旦some_func完成执行就停止打印while循环.我看到的输出是:
0
1
2
Some Func
Run Code Online (Sandbox Code Playgroud)
我预计数字会在some_func完成后继续打印.
0
1
2
Some Func
3
4
5
6
.
.
.
Run Code Online (Sandbox Code Playgroud)
获得更多数字的唯一方法是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.
由于你的一个协同程序永远运行,最后两个选项将是等效的,并将产生预期的输出.
| 归档时间: |
|
| 查看次数: |
7752 次 |
| 最近记录: |