控制台信息如下:
WARNING: WatchFiles detected changes in 'stream_formatter/tasks.py'. Reloading...
INFO: Shutting down
INFO: Waiting for background tasks to complete. (CTRL+C to force quit)
然后就一直卡在这里了
解决:一开始是想着在fastapi的lifespan函数里,主动去cancel掉asyncio.all_tasks,然而却发现uvicorn重启服务时,并不执行app的lifespan。于是改成去uvicorn的server.py里增加代码,改完却发现只能去修改源码,无法通过增加函数来魔改。
最终方案:给uvicorn增加timeout_graceful_shutdown=5的设置
修改后的runserver函数如下:
def runserver() -> None:
"""This is for debug mode to start server. For prod, use supervisor+gunicorn instead."""
import uvicorn # type:ignore
root_app = Path(__file__).stem + ":app"
auto_reload = "PYCHARM_HOSTED" not in os.environ
host, port = "0.0.0.0", 9000
if sys.argv[1:] and sys.argv[1].isdigit():
port = int(sys.argv[1])
if (pf := sys.platform) == "darwin" or pf.lower().startswith("win"):
tool = "open" if Path("/usr/bin/open").exists() else "explorer"
subprocess.run([tool, f"http://127.0.0.1:{port}"]) # Auto open browser
uvicorn.run(
root_app, host=host, port=port, reload=auto_reload, timeout_graceful_shutdown=5
)
if __name__ == "__main__":
runserver()