Здравствуйте, разработчик!
При попытке вторичной разработки вашего фреймворка я столкнулся с проблемой.
Моя задача заключается в том, чтобы обрабатывать запросы от веб-клиента в реальном времени, в то время как длительные операции, такие как обучение 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)