Как запустить фоновую задачу при использовании веб-сокетов в FastAPI/Starlette?Python

Программы на Python
Anonymous
Как запустить фоновую задачу при использовании веб-сокетов в FastAPI/Starlette?

Сообщение Anonymous »


My ultimate goal is to write code that only triggers other servers when calling an endpoint and waits for data from a specific channel in Redis to come in. I don't want to know external server's business logic is done due to latency.

The call_external_server background task function below will notify the external_server to send data to redis(pub/sub). However, it doesn't execute.

Here is my code:
async def call_external_server(channel, text): print("call_external_server start") async with aiohttp.ClientSession() as session: async with session.get(f"http://localhost:9000/pub?channel={channel}&text={text}") as resp: print(resp) print("call_external_server finished") return {"response": "external_server is done"} @app.websocket("/ws") async def websocket_endpoint(channel: str, websocket: WebSocket, background_task: BackgroundTasks): await websocket.accept() client_info = dict(websocket.headers) text = client_info.get("text") redis_reader: redis.client.PubSub = await get_redis_pubsub() await redis_reader.subscribe(channel) # Problem is Here background_task.add_task(call_external_server, channel, text) # Background task Doesn't work properly try: while True: message = await redis_reader.get_message(ignore_subscribe_messages=True) if message is not None: decoded_msg = message["data"].decode() if decoded_msg == STOPWORD: print("(Reader) STOP") break await websocket.send_text(decoded_msg) except Exception as e: print(e) await websocket.close() return await websocket.close() return

Источник: https://stackoverflow.com/questions/780 ... -starlette

Вернуться в «Python»