From c8a46925366361e40b65b117473db1342895b904 Mon Sep 17 00:00:00 2001 From: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com> Date: Sat, 8 Mar 2025 07:02:32 -0600 Subject: [PATCH] Update note about anyio thread pool (#2895) * Update note about anyio thread pool * Improve a bit the first sentence --------- Co-authored-by: Marcelo Trylesinski --- docs/threadpool.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/threadpool.md b/docs/threadpool.md index eec3677e..09aed716 100644 --- a/docs/threadpool.md +++ b/docs/threadpool.md @@ -1,14 +1,22 @@ # Thread Pool -When you're using `def` instead of `async def`, Starlette will run your code in a thread pool to avoid -blocking the event loop. This applies for endpoint functions and background tasks you create, but also -for internal Starlette code. +Starlette uses a thread pool in several scenarios to avoid blocking the event loop: + +- When you create a synchronous endpoint using `def` instead of `async def` +- When serving files with [`FileResponse`](responses.md#fileresponse) +- When handling file uploads with [`UploadFile`](requests.md#request-files) +- When running synchronous background tasks with [`BackgroundTask`](background.md) +- And some other scenarios that may not be documented... + +Starlette will run your code in a thread pool to avoid blocking the event loop. +This applies for endpoint functions and background tasks you create, but also for internal Starlette code. To be more precise, Starlette uses `anyio.to_thread.run_sync` to run the synchronous code. -## Limitation +## Concurrency Limitations The default thread pool size is only 40 _tokens_. This means that only 40 threads can run at the same time. +This limit is shared with other libraries: for example FastAPI also uses `anyio` to run sync dependencies, which also uses up thread capacity. If you need to run more threads, you can increase the number of _tokens_: -- 2.47.2