繁体   English   中英

VOLTTRON 代理异步运行不同的“任务”

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

https://github.com/VOLTTRON/volttron/blob/main/services/core/VolttronCentral/volttroncentral/agent.py#L300

执行 _scan_plaltform_connect_disconnect 的下一次调用被计算然后重新安排。

我没有在任何计时函数中使用 asyncio 模块,所以我无法评论这是否好。

暂无
暂无

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

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