import uvicorn
import httpx
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
async def proxy_mjpeg_stream(url: str):
async with httpx.AsyncClient() as client:
try:
async with client.stream("GET", url) as stream:
async for chunk in stream.aiter_bytes():
if chunk:
yield chunk
except httpx.ReadTimeout as ER:
print(f'ERROR ReadTimeout - {url=} - {ER}')
@app.get("/get_stream")
async def get_stream(url: str):
if url:
headers = {
"Content-Type": 'multipart/x-mixed-replace; boundary=frame',
}
return StreamingResponse(proxy_mjpeg_stream(url), headers=headers)
if __name__ == "__main__":
uvicorn.run(app)
您指出,您正在通过Web浏览器测试应用程序,您应该知道,每个浏览器都具有与给定主机名的并行连接的特定限制(以及一般而言)。该限制是硬编码的 - 例如,在Chrome和Firefox中,即6岁 - 看起来很敬畏。
因此,如果一个通过Chrome/Firefox打开了与同一域名的6个并行连接,则所有后续请求将被停滞并排队,直到有连接可用(即,当请求完成/接收到响应时)。您可以使用python客户端,如this Answers中所示,以测试您的应用程序。另外,正如链接的答案中指出的那样,在与同一端点打开新连接时,您应该从与浏览器的主session
隔离的tab中做到这一点;否则,成功的请求可能会被浏览器(即在客户端端)阻止,因为浏览器可能会在发送下一个请求之前等待对服务器上一个请求的响应(例如,用于缓存目的)。最终,请查看this Answer如何在应用程序启动时创建可重复使用的HTTP客户端,而不是每次称为端点时创建一个新实例。