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