Закрытие соединения в Python с помощью asyncio - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь получить данные из базы данных для использования в контексте API. Однако я заметил, что conn.close () выполнялось относительно долго (в этом контексте conn - это соединение из пула mysql соединений). Поскольку закрытие соединения не блокирует способность API возвращать данные, я решил использовать asyncio, чтобы закрыть соединение asyn c, чтобы не блокировать возвращаемые данные.

async def get_data(stuff):
    conn = api.db.get_connection()
    cursor = conn.cursor(dictionary=True)
    data = execute_query(stuff, conn, cursor)
    cursor.close()
    asyncio.ensure_future(close_conn(conn))
    return helper_rows

async def close_conn(conn):
    conn.close()

results = asyncio.run(get_data(stuff))

Однако, несмотря на факт, что asyncio.ensure_future (close (conn)) не блокируется (я поместил временные операторы, чтобы увидеть, как долго все выполнялось, а те, которые были до и после этой команды, отличались примерно на 1 мс), фактический результат не будет получен, пока close_conn выполнен. (Я проверил это, используя операторы time и разницу во времени между моментом, когда он достигает оператора return в get_data, и когда строка после results = asyncio.run (get_data (stuff)) составляет около 200 мс).

Поэтому мой вопрос заключается в том, как сделать так, чтобы этот код закрывал соединение в фоновом режиме, чтобы я мог go опередить и обработать данные, не дожидаясь их.

1 Ответ

0 голосов
/ 24 апреля 2020

Поскольку conn.close() не является сопрограммой, оно блокирует событие l oop, когда запланировано close_conn. Если вы хотите сделать то, что вы описали, используйте asyn c sql клиент и выполните await conn.close().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...