Есть ли лучшие способы запустить uvicorn в потоке? - PullRequest
0 голосов
/ 19 сентября 2019

Uvicorn не будет работать внутри потока, потому что сигналы не работают в потоках.Простое удаление обработки сигнала останавливает закрытие сервера (необходимо принудительное отключение)

Мое решение было вмешиваться в функцию __new__, чтобы получить объект сервера и создать функцию отключения, а затем привязать ее ксигнал за пределами потока.

Однако это действительно ужасное решение.Есть ли лучшие способы?

def run():
    '''
    Start uvicorn server
    returns exit function
    '''
    server = None

    old_new = uvicorn.Server.__new__

    def spoof_server(self, *_, **__):
        '''Interfeer with __new__ to set server'''
        nonlocal server
        server = old_new(self)
        return server

    uvicorn.Server.__new__ = spoof_server
    uvicorn.Server.install_signal_handlers = lambda *_, **__: None

    Thread(target=uvicorn.run, args=[make_app()]).start()

    def exit_server():
        print('exiting...')
        server.handle_exit(None, None)

    return exit_server
...