Fix server shut down on exit.

If there's a websocket being waited on the shut down won't actually
happen. Add a new event for shut down and send it to break the websocket
out of its loop.
This commit is contained in:
Dan Albert 2022-02-25 17:12:00 -08:00
parent 2efe4f6c80
commit af4a718fc7
3 changed files with 12 additions and 0 deletions

View File

@ -14,6 +14,10 @@ async def event_stream(websocket: WebSocket) -> None:
await websocket.accept()
while True:
if not (events := await EventStream.get()).empty:
if events.shutting_down:
await websocket.close()
return
await websocket.send_json(
jsonable_encoder(
GameUpdateEventsJs.from_events(events, GameContext.get())

View File

@ -6,8 +6,10 @@ from threading import Thread
import uvicorn
from uvicorn import Config
from game.server import EventStream
from game.server.app import app
from game.server.settings import ServerSettings
from game.sim import GameUpdateEvents
class Server(uvicorn.Server):
@ -34,4 +36,5 @@ class Server(uvicorn.Server):
yield
finally:
self.should_exit = True
EventStream.put_nowait(GameUpdateEvents().shut_down())
thread.join()

View File

@ -25,6 +25,7 @@ class GameUpdateEvents:
deleted_flights: set[UUID] = field(default_factory=set)
selected_flight: UUID | None = None
deselected_flight: bool = False
shutting_down: bool = False
@property
def empty(self) -> bool:
@ -89,3 +90,7 @@ class GameUpdateEvents:
self.deselected_flight = True
self.selected_flight = None
return self
def shut_down(self) -> GameUpdateEvents:
self.shutting_down = True
return self