import time import asyncio import logging from .consts import ADAPTERS class ServiceWorker: def __init__(self, manager, name, service): self.name = name self.manager = manager self.service = service self.adapter = ADAPTERS[service['adapter']] self.log = logging.getLogger(f'elstat.service.{name}') self.last_poll = None self._start() async def work(self): res = await self.adapter.query(self, self.service['adapter_args']) return res async def _work_loop(self): try: while True: self.log.info(f'polling {self.name}') self.last_poll = time.monotonic() await self.work() await asyncio.sleep(self.service['poll']) except Exception: self.log.exception('fail on poll') def _start(self): self.log.info(f'starting work loop for {self.name}') self.manager.loop.create_task(self._work_loop())