繁体   English   中英

python asyncio 在后台运行无限循环并从循环访问类变量

[英]python asyncio run infinite loop in background and access class variable from the loop

我有一个Sensor类,它有一个数值num 它有一个async方法update ,它在无限循环中每秒更新num

我想启动该类并调用方法update ,使其保持运行并在一段时间后将控制权返回给主程序以访问num的值。 我正在使用asyncio但不知道如何调用该方法以使循环和变量访问的并发运行是可行的。

代码:

import asyncio
import time


class Sensor:
    def __init__(self, start=0):
        self.num = start

    async def update(self):
        print(f"Starting Updates{self.num}")
        while True:
            self.num += 1
            print(self.num)
            await asyncio.sleep(1)


if __name__ == "__main__":
    print("Main")
    sensor = Sensor()
    # asyncio.run(sensor.update())
    # asyncio.ensure_future(sensor.update())
    future = asyncio.run_coroutine_threadsafe(sensor.update(), asyncio.new_event_loop())
    print("We are back")
    print(f"current value: {sensor.num}")
    time.sleep(4)
    print(f"current value: {sensor.num}")


这让我在等待 4 秒之前和之后输出0 ,这意味着update方法没有落后。 run()根本不返回控件。

我应该调用哪种方法在后台调用无限循环?

要使用asyncio.run_coroutine_threadsafe ,您需要在单独的线程中实际运行事件循环。 例如:

sensor = Sensor()
loop = asyncio.new_event_loop()
threading.Thread(target=loop.run_forever).start()
future = asyncio.run_coroutine_threadsafe(sensor.update(), loop)
...
loop.call_soon_threadsafe(loop.stop)

根据并发运行任务的文档,您应该使用gather 例如,您的代码将是这样的:

import asyncio
import time


class Sensor:
    def __init__(self, start=0):
        self.num = start

    async def update(self):
        print(f"Starting Updates{self.num}")
        while True:
            self.num += 1
            print(self.num)
            await asyncio.sleep(1)


async def print_value(sensor):
    print("We are back")
    print(f"current value: {sensor.num}")
    await asyncio.sleep(4)
    print(f"current value: {sensor.num}")


async def main():
    print("Main")
    sensor = Sensor()
    await asyncio.gather(sensor.update(), print_value(sensor))

if __name__ == "__main__":
    asyncio.run(main())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM