fix(retrieval): offload Loader.load to a worker thread so file uploads stop blocking the event loop (#23705)

Loader.load() dispatches to the underlying langchain document loaders
(PyMuPDF, Unstructured, python-docx, Tika, …) which are all
synchronous and CPU/IO-bound. process_file() awaited it directly on
the event loop, so parsing a non-trivial PDF/DOCX would freeze the
entire FastAPI app for the duration of the parse — which is what users
experience as "the server hangs whenever I upload a file."

Add an `aload()` async wrapper on Loader that runs the sync load on a
worker thread via asyncio.to_thread, and update process_file() to
await it. The sync API is preserved so existing callers that already
run inside run_in_threadpool (e.g. save_docs_to_vector_db) are
unaffected.

https://claude.ai/code/session_01JSr4NZSskEUQvoJnavVXh8

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Classic298
2026-04-14 10:55:46 -05:00
committed by GitHub
co-authored by Claude
parent 4866bec0f2
commit a3ea7bf043
2 changed files with 14 additions and 1 deletions
+1 -1
View File
@@ -1646,7 +1646,7 @@ async def process_file(
MINERU_API_TIMEOUT=request.app.state.config.MINERU_API_TIMEOUT,
MINERU_PARAMS=request.app.state.config.MINERU_PARAMS,
)
docs = loader.load(file.filename, file.meta.get('content_type'), file_path)
docs = await loader.aload(file.filename, file.meta.get('content_type'), file_path)
docs = [
Document(