[英]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.