Checklist
Describe the bug
When the startup fails, either on reload mode or multiple workers, the main process is not terminated.
To reproduce
Application:
# test.py
from fastapi import FastAPI
app = FastAPI()
@app.on_event("startup")
def startup():
raise Exception("Hi")
uvicorn test:app --workers 2
# or
uvicorn test:app --reload
Expected behavior
All the processes (parent and children) should be terminated.
Actual behavior
❯ uvicorn test:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [40026] using watchgod
INFO: Started server process [40028]
INFO: Waiting for application startup.
ERROR: Traceback (most recent call last):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 540, in lifespan
async for item in self.lifespan_context(app):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 481, in default_lifespan
await self.startup()
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 518, in startup
handler()
File "/home/marcelo/Development/./test.py", line 7, in startup
raise Exception("Hi")
Exception: Hi
ERROR: Application startup failed. Exiting.
After this log, it hangs forever. On the reload, it doesn't prevent the failure from happening multiple times if you modify a watched file. See:
❯ uvicorn test:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [40674] using watchgod
INFO: Started server process [40676]
INFO: Waiting for application startup.
ERROR: Traceback (most recent call last):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 540, in lifespan
async for item in self.lifespan_context(app):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 481, in default_lifespan
await self.startup()
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 518, in startup
handler()
File "/home/marcelo/Development/./test.py", line 7, in startup
raise Exception("Hi")
Exception: Hi
ERROR: Application startup failed. Exiting.
WARNING: WatchGodReload detected file change in '['/home/marcelo/Development/test.py']'. Reloading...
INFO: Started server process [40734]
INFO: Waiting for application startup.
ERROR: Traceback (most recent call last):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 540, in lifespan
async for item in self.lifespan_context(app):
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 481, in default_lifespan
await self.startup()
File "/home/marcelo/anaconda3/envs/uvicorn/lib/python3.8/site-packages/starlette/routing.py", line 518, in startup
handler()
File "/home/marcelo/Development/./test.py", line 7, in startup
raise Exception("Hi")
Exception: Hi
ERROR: Application startup failed. Exiting.
In the case of multiple workers, it just hangs forever.
Environment
- OS / Python / Uvicorn version: Running uvicorn 0.14.0 with CPython 3.8.10 on Linux
Checklist
master.Describe the bug
When the startup fails, either on reload mode or multiple workers, the main process is not terminated.
To reproduce
Application:
uvicorn test:app --workers 2 # or uvicorn test:app --reloadExpected behavior
All the processes (parent and children) should be terminated.
Actual behavior
After this log, it hangs forever. On the
reload, it doesn't prevent the failure from happening multiple times if you modify a watched file. See:In the case of multiple workers, it just hangs forever.
Environment