a failure in background nursery prevents further use of lifespan
this also blocks further tasks from the nursery and also prevents await self.app.shutdown()
being called, a demo app:
import httpx
import anyio
import quart
import quart_trio
import logging
logger = logging.getLogger(__name__)
blueprint = quart.Blueprint("blueprint", __name__)
class MyCrashError(Exception):
pass
@blueprint.route("/")
async def index():
async def crash():
raise MyCrashError
quart.current_app.nursery.start_soon(crash)
return b""
def create_app():
app = quart_trio.QuartTrio(__name__)
app.register_blueprint(blueprint)
return app
async def amain():
async with anyio.create_task_group() as tg:
tg.start_soon(create_app().run_task)
async with httpx.AsyncClient() as client:
await client.get("http://localhost:5000/")
(await client.get("http://localhost:5000/")).raise_for_status()
anyio.run(amain, backend="trio")
tracebacks:
2021-05-13 19:04:22,398] Running on http://127.0.0.1:5000 (CTRL + C to quit)
[2021-05-13 19:04:22,414] 127.0.0.1:56808 GET / 1.1 200 0 2337
[2021-05-13 19:04:22,416] ERROR in app: Exception on request GET /
Traceback (most recent call last):
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart_trio/app.py", line 131, in handle_request
return await self.full_dispatch_request(request_context)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart_trio/app.py", line 153, in full_dispatch_request
result = await self.handle_user_exception(error)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart_trio/app.py", line 168, in handle_user_exception
return await super().handle_user_exception(error)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart/app.py", line 943, in handle_user_exception
raise error
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart_trio/app.py", line 151, in full_dispatch_request
result = await self.dispatch_request(request_context)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart/app.py", line 1511, in dispatch_request
return await self.ensure_async(handler)(**request_.view_args)
File "/home/graingert/projects/demo-quart-trio/foo.py", line 22, in index
quart.current_app.nursery.start_soon(crash)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/trio/_core/_run.py", line 988, in start_soon
GLOBAL_RUN_CONTEXT.runner.spawn_impl(async_fn, args, self, name)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/trio/_core/_run.py", line 1429, in spawn_impl
raise RuntimeError("Nursery is closed to new arrivals")
RuntimeError: Nursery is closed to new arrivals
[2021-05-13 19:04:22,414] ASGI Framework Lifespan error, continuing without Lifespan support
Traceback (most recent call last):
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/hypercorn/trio/lifespan.py", line 29, in handle_lifespan
await invoke_asgi(self.app, scope, self.asgi_receive, self.asgi_send)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/hypercorn/utils.py", line 239, in invoke_asgi
await app(scope, receive, send)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart/app.py", line 1697, in __call__
await self.asgi_app(scope, receive, send)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart/app.py", line 1723, in asgi_app
await asgi_handler(receive, send)
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/quart_trio/asgi.py", line 148, in __call__
break
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/trio/_core/_run.py", line 815, in __aexit__
raise combined_error_from_nursery
File "/home/graingert/projects/demo-quart-trio/foo.py", line 20, in crash
raise MyCrashError
MyCrashError
[2021-05-13 19:04:22,419] 127.0.0.1:56808 GET / 1.1 500 290 2909
Traceback (most recent call last):
File "/home/graingert/projects/demo-quart-trio/foo.py", line 40, in <module>
anyio.run(amain, backend="trio")
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/anyio/_core/_eventloop.py", line 55, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/trio/_core/_run.py", line 1932, in run
raise runner.main_task_outcome.error
File "/home/graingert/projects/demo-quart-trio/foo.py", line 37, in amain
(await client.get("http://localhost:5000/")).raise_for_status()
File "/home/graingert/.virtualenvs/testing39/lib/python3.9/site-packages/httpx/_models.py", line 1405, in raise_for_status
raise HTTPStatusError(message, request=request, response=self)
httpx.HTTPStatusError: 500 Server Error: for url: http://localhost:5000/
For more information check: https://httpstatuses.com/500
Edited by Thomas Grainger