python - asyncio create_task 永远运行
问题描述
我有以下代码
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
。
由于您的协程之一永远运行,最后两个选项将是等效的,并将产生预期的输出。
推荐阅读
- c# - 添加线程时的循环重复计数器
- asp.net-mvc - -1073741819 (0xc0000005) asp net core 中的访问冲突
- forms - 将自定义操作(拒绝、等待、接受)添加到网络表单提交 - Drupal 8
- python - 调整大小功能旋转图像
- c# - Telerik MVC 星级评定,调整星星大小
- c# - 如何在 Xamarin.Forms 的 Listview 中保持计时器的状态
- python - 如果条件应该返回真,但返回假
- c# - 如果使用了 FieldOffset,必须在每个类/结构成员上使用它吗?
- django - 在我的 Django 应用程序中实现用户类型限制
- python - keras - 使用嵌入层检查目标时出错