Вот пример с очень быстрым запрос и один длинный запрос:
Код: Выделить всё
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 !
Я не могу найти способ заставить его остановиться. Я что-то упустил?
Подробнее здесь: https://stackoverflow.com/questions/788 ... on-asyncio