Так например есть слои BLL(Service), DAL(Connector, Repository), WebApi(Api,Run)
Пример без слоев для DAL:
conn = await aiomysql.connect(host=config.get('DataBase', 'host'), port=3306, user=config.get('DataBase','user'), password=config.get('DataBase', 'password'), db='testdb', loop=loop) cur = await conn.cursor() await cur.execute("SELECT Host,User FROM user") r = await cur.fetchall() await cur.close() conn.close()
Как бы все просто, но в слоях, я так понимаю в Connector будет типа:
class Conenction(): def __init__(self): self.conn = None async def getConnection(self): if self.conn is None: await self.__connect() if not self.conn.is_connected(): await self.__connect() return self.conn async def __connect(self): self.conn = await aiomysql.connect(host=config.get('DataBase', 'host'), port=3306, user=config.get('DataBase','user'), password=config.get('DataBase', 'password'), db='testdb', loop=loop)
а в репозитории я также буду писать async/await везде??!, где использую Connection, например :
class Repository(): def __init__(self): self.cn = Conenction() async def insert(self, item): try: self.cnn = await self.cn.getConnection() self.cur = await self.cnn.cursor() sql = InsertNewSMS val = (item.text, item.phoneNumber) await self.cur.execute(sql, val) await self.cnn.commit() except Exception as e: logging.critical("insertSms "+ str(e)) finally: if self.cur: await self.cur.close() if self.cnn: await self.cnn.close()
То есть надо ли в репозитории, а затем и в сервисе в методах писать Async/await () и если где-то не написан, то код станет синхронным или он будет частично асинхронным??
И еще вопрос, в классе Conenction для подключения используется loop, если добавлю tornado, а там также loop, то надо ли будет этот loop вынести в отдельный файл и его подключить для Conenction и Run:
файл Loop
ioloop = asyncio.get_event_loop()
application = tornado.web.Application([ (r'/send', Send) ]) if __name__ == "__main__": application.listen(config.get("WebApi", "port")) # как то надо задействовать ioloop, но как? tornado.ioloop.IOLoop.instance().start()#явно не так
И вот как задействовать для торнадо ioloop?