Отменить ожидающий pd.read_sql_query в Python asyncioPython

Программы на Python
Anonymous
Отменить ожидающий pd.read_sql_query в Python asyncio

Сообщение Anonymous »

Я выполняю SQL-запросы к нескольким базам данных асинхронно с помощью asyncio. Я хочу установить таймаут после 1 секунды выполнения и получать результат успешных SQL-запросов вовремя, не дожидаясь остальных.
Вот пример с очень быстрым запрос и один длинный запрос:

Код: Выделить всё

import asyncio
import functools
import logging

import pandas as pd
from sqlalchemy import create_engine

engine1 = create_engine("mysql+pymysql://root:root@localhost:3306/my_db1")
engine2 = create_engine("mysql+pymysql://root:root@localhost:3306/my_db2")

logger = logging.getLogger(__name__)

async def run_query(query, engine):
loop = asyncio.get_event_loop()
try:
await loop.run_in_executor(None, functools.partial(pd.read_sql_query, query, engine))
logger.info("query over")
except asyncio.CancelledError:
logger.warning("long running query cancelled !")

async def main():
done, not_done = await asyncio.wait(
[
asyncio.create_task(run_query("SELECT 1", engine1)),  # Fast query
asyncio.create_task(
run_query(
# Long running query
"select benchmark(100000000, md5('when will it end?'))",
engine2,
),
),
],
timeout=1,
)

logger.info("starting")
asyncio.run(main())
logger.info("all done !")

Выход:

Код: Выделить всё

2024-08-02 11:19:02,098 :: __main__ :: INFO     :: starting
2024-08-02 11:19:02,105 :: __main__ :: INFO     :: query over
2024-08-02 11:19:03,100 :: __main__ :: WARNING  :: long running query cancelled !
2024-08-02 11:19:41,146 :: __main__ :: INFO     :: all done !
Как и ожидалось, длительный запрос отменяется через 1 секунду. Но скрипт продолжает ждать завершения.
Я не могу найти способ заставить его остановиться. Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/788 ... on-asyncio

Вернуться в «Python»