Ich bin ziemlich neu in Async in Python. Derzeit versuche ich, einen WebSocket-Endpunkt mit Fastapi zu implementieren, der eine langjährige Aufgabe ausführt. Der folgende Code wird verwendet: < /p>
@router.websocket("/ws/catalog.check")
async def websocket_endpoint(ws: WebSocket, user: Annotated[UserWithGroupEntity, Depends(user_middleware_ws)]) -> None:
manager = WSManager()
await manager.connect(ws)
try:
raw_req = await ws.receive_json()
req = CatalogCheckRequest.model_validate(raw_req)
await manager.send_personal_json(CatalogCheckResponse(message=CatalogCheckMessage(data='Process started')),
ws)
#long-running task
check_result = await create_task(CatalogHandler.catalog_check(user.group_name, req.source, req.csv))
await manager.send_personal_json(CatalogCheckResponse(result=check_result), ws)
except Exception as e:
await manager.send_personal_json(CatalogCheckResponse(message=CatalogCheckMessage(data=repr(e), warning=True)),
ws)
await manager.disconnect(ws)
< /code>
Wenn dieser Vorgang ausgeführt wird und ich an einen anderen HTTP -Endpunkt in sende, wird blockiert. Zum Beispiel wird der folgende /Health.Check < /code> Endpunkt nur ausgeführt, wenn die langfristige Aufgabe abgeschlossen ist: < /p>
@router.get("/health.check")
def health_check(config: Annotated[Config, Depends(get_config)],
log: Annotated[Log, Depends(get_logger)]) -> Dict[str, Any]:
try:
conf = config.model_dump()
log.info(conf)
resp = {"status": "ok"}
except Exception as e:
resp = {"status": repr(e)}
return resp
< /code>
Dies macht die ganze Idee meiner API. Was kann ich tun, um diesen WebSocket-Endpunkt nicht blockieren zu lassen?
Wie erstelle ich einen nicht blockierenden WebSocket-Endpunkt in Fastapi? ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post