Изящное завершение работы приложения uvicorn starlette с помощью веб-сокетов - PullRequest
1 голос
/ 27 сентября 2019

Учитывая пример этого приложения Starlette с открытым подключением к веб-сокету, как вы закрываете приложение Starlette?Я бегу на Uvicorn.Всякий раз, когда я нажимаю Ctrl+C, вывод будет Waiting for background tasks to complete., который зависает навсегда.

from starlette.applications import Starlette

app = Starlette()

@app.websocket_route('/ws')
async def ws(websocket):
    await websocket.accept()

    while True:
        # How to interrupt this while loop on the shutdown event?
        await asyncio.sleep(0.1)

    await websocket.close()

Я пытался переключить переменную bool в событии shutdown, но эта переменная никогда не обновляется.Это всегда False.

например.

app.state.is_shutting_down = False


@app.on_event('shutdown')
async def shutdown():
    app.state.is_shutting_down = True


@app.websocket_route('/ws')
async def ws(websocket):
    await websocket.accept()

    while app.state.is_shutting_down is False:
...