class Uvicorn(Component): cfg: UvicornConfig def __init__(self, cfg: UvicornConfig, fapp: FastAPI): self.cfg = cfg self.fapp = fapp self._srv: Optional[Server] = None self._loop_fut: Optional[asyncio.Future] = None self._sockets = None async def prepare(self) -> None: cfg = Config(AppWrapper(self, self.fapp), **self.cfg.dict()) self._srv = Server(cfg) async def start(self) -> None: if self._srv is None: raise UserWarning config = self._srv.config if not config.loaded: config.load() self._srv.lifespan = config.lifespan_class(config) self._srv.install_signal_handlers() self._sockets = None await self._srv.startup(sockets=self._sockets) if self._srv.should_exit: return self.fut = asyncio.ensure_future(self._srv.main_loop()) async def stop(self) -> None: if self._srv is None: raise UserWarning await self._srv.shutdown(sockets=self._sockets) self.fut.cancel() async def health(self) -> None: pass
def server_run(): def on_tick_sync(): if not ready.is_set(): loops.append(asyncio.get_event_loop()) ready.set() async def on_tick(): on_tick_sync() config = Config(app, host="127.0.0.1", port=port, loop="asyncio") config.callback_notify = on_tick config.log_config = {"version": 1} config.disable_lifespan = True config.logger = logging.getLogger("uvicorn") server = Server(config=config) server.install_signal_handlers = lambda *args, **kwargs: None try: server.started.set = on_tick_sync except Exception: pass server.run()