📝 Add `await` in `StreamingResponse` code example to allow cancellation (#14681)

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
Casper da Costa-Luis 2026-02-27 19:12:46 +00:00 committed by GitHub
parent ea80e466db
commit c3f54a0794
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 1 deletions

View File

@ -167,7 +167,17 @@ You can also use the `status_code` parameter combined with the `response_class`
Takes an async generator or a normal generator/iterator and streams the response body.
{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *}
{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *}
/// note | Technical Details
An `async` task can only be cancelled when it reaches an `await`. If there is no `await`, the generator (function with `yield`) can not be cancelled properly and may keep running even after cancellation is requested.
Since this small example does not need any `await` statements, we add an `await anyio.sleep(0)` to give the event loop a chance to handle cancellation.
This would be even more important with large or infinite streams.
///
#### Using `StreamingResponse` with file-like objects { #using-streamingresponse-with-file-like-objects }

View File

@ -1,3 +1,4 @@
import anyio
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
@ -7,6 +8,7 @@ app = FastAPI()
async def fake_video_streamer():
for i in range(10):
yield b"some fake video bytes"
await anyio.sleep(0)
@app.get("/")