[英]VOLTTRON agent run different "tasks" asynchronously
我正在使用代理创建向导创建 VOLTTRON 控制代理,是否可以在代理代码中异步运行不同的任务?
例如,在特定条件下(需求响应事件),我希望使用执行器代理每 60 秒读取一次区域温度并将该数据存储在数据结构中,然后每 300 秒(可能更频繁)评估传感器数据以如果某些区域可以通过执行器代理释放 BACnet,请根据传感器读数/条件做出一些决定。 另一个任务每 5 秒运行一次,以查看需求响应事件是否仍处于活动状态或已过期。
希望这不是一个愚蠢的问题,但可以在代理内部使用多个周期来运行不同的“任务”吗? 有点像下面注意代理onstart
:
class Agent:
def __init__(self):
self.stuff1 = False
self.stuff2 = False
def get_sensor_readings(self):
print("Getting sensor readings!!!")
def evauluate_data(self):
print("Evaluating the data!!!")
def checker(self):
print("Checking the event status!!!")
@Core.receiver("onstart")
def onstart(self, sender) -> None:
"""The agent has started."""
_log.info(f"Sender {sender}")
_log.info("Starting agent...")
self.core.periodic(60, self.get_sensor_readings)
self.core.periodic(300, self.evauluate_data)
self.core.periodic(5, self.checker)
@Core.receiver("onstop")
def onstop(self, sender, **kwargs):
或者我可以在代理中使用asyncio
吗? 也许像这样的事情,anyncio 任务在不使用时被取消......
import asyncio
class Agent:
def __init__(self):
self.stuff1 = False
self.stuff2 = False
async def get_sensor_readings(self):
print("Getting sensor readings!!!")
asyncio.sleep(60)
async def evauluate_data(self):
print("Evaluating the data!!!")
asyncio.sleep(300)
async def checker(self):
print("Checking the event status!!!")
asyncio.sleep(5)
async def main(self):
readings = asyncio.ensure_future(self.get_sensor_readings())
analysis = asyncio.ensure_future(self.evauluate_data())
checker = asyncio.ensure_future(self.check_time())
await readings # run every 60 seconds
await analysis # run every 300 seconds
await checker # run every 5 seconds
async def main():
agent= Agent()
await agent.main()
@Core.receiver("onstart")
def onstart(self, sender) -> None:
asyncio.run(main())
@Core.receiver("onstop")
def onstop(self, sender, **kwargs):
# cancel asyncio tasks
readings.cancel()
analysis.cancel()
checker.cancel()
非常感谢任何最佳实践!!!!
当然,您一次可以做不止一件异步事情。 目前,核心 api 有一个 spawn 功能,可以为您创建一个 greenlet。 至于不同的时间表,您可以创建多个周期和/或如果需要,您可以使用调度程序来执行此操作。
self._platform_scan_event = self.core.schedule(
next_platform_scan, self._scan_platform_connect_disconnect)
执行 _scan_plaltform_connect_disconnect 的下一次调用被计算然后重新安排。
我没有在任何计时函数中使用 asyncio 模块,所以我无法评论这是否好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.