【发布时间】:2019-09-19 11:35:41
【问题描述】:
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
【问题讨论】:
-
我不知道 Uvicorn 的答案,但是 Hypercorn(另一个 ASGI 服务器)可以做到这一点 - 请参阅这些 docs。 (认为这总比没有好)。
-
感谢 pgjones 的建议!我最终做的是转移到 aiohttp 这也是 cad 做的。
标签: python python-multithreading uvicorn