import abc import time import aiomysql from loguru import logger from config import settings class LoadData(metaclass=abc.ABCMeta): def __init__(self, *args, **kwargs): self.gm_db_pool = kwargs.get('gm_db_pool') self.gm_key = None self.act_time = None self.last_act_time = None async def get_kv(self, key, try_count=3): try: sql = 'select v from gm_kv where k=%s' ts = int(time.time()) async with self.gm_db_pool.acquire() as conn: async with conn.cursor(aiomysql.DictCursor) as cur: await cur.execute(sql, (settings.KV_PREFIX + key,)) res = (await cur.fetchone()) or {} v = int(res.get('v') or ts) self.last_act_time = v if not res: await self.set_kv(key, ts) return v except Exception as e: if try_count > 0: logger.warning(f'连接gm mysql失败 剩余次数{try_count - 1}') return await self.get_kv(key, try_count - 1) else: raise e async def set_kv(self, key, value): key = settings.KV_PREFIX + key sql = 'replace into gm_kv set k=%s,v=%s' async with self.gm_db_pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute(sql, (key, value)) await conn.commit() @abc.abstractmethod async def get_data(self): pass @abc.abstractmethod async def update_data(self, data): pass async def run(self): ts = int(time.time()) self.act_time = ts data = await self.get_data() await self.update_data(data) if self.gm_key: await self.set_kv(self.gm_key, self.act_time)