First Check
Commit to Help
Example Code
from typing import List
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
app = FastAPI()
html = """
<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
</head>
<body>
<h1>WebSocket Chat</h1>
<h2>Your ID: <span id="ws-id"></span></h2>
<form action="" onsubmit="sendMessage(event)">
<input type="text" id="messageText" autocomplete="off"/>
<button>Send</button>
</form>
<ul id='messages'>
</ul>
<script>
var client_id = Date.now()
document.querySelector("#ws-id").textContent = client_id;
var ws = new WebSocket(`ws://localhost:8000/ws/${client_id}`);
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
</script>
</body>
</html>
"""
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.get("/")
async def get():
return HTMLResponse(html)
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.send_personal_message(f"You wrote: {data}", websocket)
await manager.broadcast(f"Client #{client_id} says: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast(f"Client #{client_id} left the chat")
Description
I'm using the example from FastAPI documentation for websockets, everything works fine while i have only 1 worker on my app, but when i set back 4 workers, seems that each worker has his own app instance.
How can i manage websockets within multiple workers? Each time i save a connection on the Manager class, it seems to be saved only in one random app instance, no way to save it for each app instance for each worker?
Operating System
Linux
Operating System Details
No response
FastAPI Version
0.68.1
Python Version
3.9.4
Additional Context
No response
First Check
Commit to Help
Example Code
Description
I'm using the example from FastAPI documentation for websockets, everything works fine while i have only 1 worker on my app, but when i set back 4 workers, seems that each worker has his own
appinstance.How can i manage websockets within multiple workers? Each time i save a connection on the Manager class, it seems to be saved only in one random app instance, no way to save it for each
appinstance for each worker?Operating System
Linux
Operating System Details
No response
FastAPI Version
0.68.1
Python Version
3.9.4
Additional Context
No response