Использование асинхронных функций в магических методах
У меня есть класс, предназначенный для работы с mysql:
class MySQL:
def __init__(
self,
password: str,
database: str,
loop: asyncio.get_event_loop,
host: str = 'localhost',
port: int = 3306,
user: str = 'root',
):
self.pool = await aiomysql.create_pool(host = host, port = port, user = user,
password = password, db = database, loop = loop)
self.cursor = self.pool.acquire().cursor()
Как уже можно было понять, функция aiomysql.create_pool() - асинхронная. Но вот незадача, асинхронные функции нельзя использовать в магических методах. Как в этой ситуации быть?
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Как-то так можно запустить Ваш код:
class MySQL:
def __init__(
self,
password: str,
database: str,
loop: asyncio.get_event_loop,
host: str = 'localhost',
port: int = 3306,
user: str = 'root',
):
def on_connection(task):
loop.create_task(task.result().cursor()).add_done_callback(
lambda task: self.cursor = task.result() )
def on_pool(task):
self.pool = task.result()
loop.create_task(self.pool.acquire()).add_done_callback(on_connection)
loop.create_task(
aiomysql.create_pool(
host = host,
port = port,
user = user,
password = password,
db = database,
loop = loop).add_done_callback(on_pool)
Но курсор не будет доступен сразу после инициализации, только после нескольких await в коде, которые длятся дольше чем нужно для коннекта.
Вместо этого разделите инициализацию класса и подключение:
class MySQL:
def __init__(
self,
password: str,
database: str,
loop: asyncio.get_event_loop,
host: str = 'localhost',
port: int = 3306,
user: str = 'root',
):
self.pool = None
self.connect_args = dict(
host = host,
port = port,
user = user,
password = password,
db = database,
loop = loop)
async def connect(self):
self.pool = await aiomysql.create_pool(** self.connect_args)
async def get_cursor(self)
return await (await self.pool.acquire()).cursor()
И класс в коде используется
my = MySQL(....)
await my.connect()
cursor = await my.get_cursor()