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

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

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

import asyncio

class MyClass:
    def __init__(self):
        self.input = False
        asyncio.run(self.start())

        print("I want to display after MyClass has started")  #This line is never reached.

    async def start(self):
        while True:
            print("Changing state...")
            if self.input:
                print("I am on.")
                break
            await asyncio.sleep(1)

m = MyClass()
m.input = True  #This line is never reached!  Why?
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循环,所以它永远不会终止。
下面是对代码的一个轻微修改,它可能显示了您所追求的并发效果-

import asyncio
class MyClass:
def __init__(self):
    self.input = False
    asyncio.run(self.main())

    print("I want to display after MyClass has been initialized.")  # This line is never reached.

async def main(self):
    work1 = self.work1()
    work2 = self.work2()
    await asyncio.gather(work1, work2)

async def work1(self):
    for idx in range(5):
        print('doing some work 1...')
        await asyncio.sleep(1)

async def work2(self):
    for idx in range(5):
        print('doing some work 2...')
        await asyncio.sleep(1)
m = MyClass()
print("I want to display after MyClass is terminated")

相关问题