예제 #1
0
파일: uvicorn.py 프로젝트: scorp249/ipapp
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()