等待asyncio.sleep(1)在python中不工作

qnakjoqk  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(461)

我的代码执行未到达打印语句: print("I want to display after MyClass has started") 为什么会这样?我认为wait asyncio.sleep()的目的是取消对代码执行的阻止,以便后续代码行可以运行。不是这样吗?

  1. import asyncio
  2. class MyClass:
  3. def __init__(self):
  4. self.input = False
  5. asyncio.run(self.start())
  6. print("I want to display after MyClass has started") #This line is never reached.
  7. async def start(self):
  8. while True:
  9. print("Changing state...")
  10. if self.input:
  11. print("I am on.")
  12. break
  13. await asyncio.sleep(1)
  14. m = MyClass()
  15. m.input = True #This line is never reached! Why?
  16. print("I want to display after MyClass is started")

当我执行时,它会一直打印“更改状态…”。即使我按ctrl+c键退出,执行仍将继续,如下所示。我怎样才能恰当地终止执行?对不起,我是python新手。

编辑:我理解asyncio的常见用法是异步运行两个或多个单独的函数。然而,我的类将对其状态的变化做出响应。例如,我打算在setters中编写代码,以便在类对象属性更改时执行某些操作,同时在后台仍有一个while true事件循环运行。难道没有办法允许这样吗?我已经尝试在它自己的线程中运行事件循环。然而,该线程占主导地位,类对象的响应时间长达几秒钟。这可能是由于gil(全局解释器锁),我们对此无能为力。我也尝试过使用多处理,但是当并行进程在它们自己的内存空间中运行时,我就无法访问对象的属性和方法。

kulphzqa

kulphzqa1#

在myclass的init方法中调用asyncio.run()-此方法将执行所需的例程,直到该例程终止。在您的例子中,因为main方法包含while true循环,所以它永远不会终止。
下面是对代码的一个轻微修改,它可能显示了您所追求的并发效果-

  1. import asyncio
  2. class MyClass:
  3. def __init__(self):
  4. self.input = False
  5. asyncio.run(self.main())
  6. print("I want to display after MyClass has been initialized.") # This line is never reached.
  7. async def main(self):
  8. work1 = self.work1()
  9. work2 = self.work2()
  10. await asyncio.gather(work1, work2)
  11. async def work1(self):
  12. for idx in range(5):
  13. print('doing some work 1...')
  14. await asyncio.sleep(1)
  15. async def work2(self):
  16. for idx in range(5):
  17. print('doing some work 2...')
  18. await asyncio.sleep(1)
  19. m = MyClass()
  20. print("I want to display after MyClass is terminated")
展开查看全部

相关问题