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