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() await websocket.accept()
while True: while True:
if not (events := await EventStream.get()).empty: if not (events := await EventStream.get()).empty:
if events.shutting_down:
await websocket.close()
return
await websocket.send_json( await websocket.send_json(
jsonable_encoder( jsonable_encoder(
GameUpdateEventsJs.from_events(events, GameContext.get()) GameUpdateEventsJs.from_events(events, GameContext.get())

View File

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

View File

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