1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ktianc-kinit

 / Детали:

Проблема зависания SQLAlchemy в многопоточной среде

Предстоит сделать
Владелец
Создано  
23.04.2025

Здравствуйте, разработчик!

При попытке вторичной разработки вашего фреймворка я столкнулся с проблемой.

Моя задача заключается в том, чтобы обрабатывать запросы от веб-клиента в реальном времени, в то время как длительные операции, такие как обучение AI, выполняются в отдельном потоке. После завершения обработки данных мне нужно сохранить результат в базе данных MySQL.

Однако, когда код доходит до строки await self.db.flush() в потоке, выполнение застревает и не продолжается дальше. Если же ту же самую логику поместить в основной поток, проблема не возникает.

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

Вот пример кода:

def start_thread_loop(loop):
    asyncio.set_event_loop(loop)

# Многопоточный метод
async def thread_fun(data, auth):
    # ...
    # Пропущен код, который выполняется длительное время
    
    # Код застревает здесь
    await crud.ChatDal(auth.db).create_data(data=data)
    # Этот принт не выполняется
    print("thread_fun завершена")

@app.post("/request", summary="WEB запрос")
async def req_msg(request: Request, data: schemas.Message, auth: Auth = Depends(AllUserAuth())):
    # Здесь операции с базой данных выполняются корректно
    await crud.ChatDal(auth.db).create_data(data=data)
```    # Это попытка запустить многопоточный метод
    loop = asyncio.get_event_loop()
    t = threading.Thread(target=start_thread_loop, args=[loop])
    t.start()
    asyncio.run_coroutine_threadsafe(thread_fun(data, auth), loop)

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/ktianc-kinit.git
git@api.gitlife.ru:oschina-mirror/ktianc-kinit.git
oschina-mirror
ktianc-kinit
ktianc-kinit