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