Compare commits

...

2 Commits

Author SHA1 Message Date
Tyler Goodlet b1018a13fe Continue supporting py3.11+
Apparently the only thing needing a guard was use of
`asyncio.Queue.shutdown()` and the paired `QueueShutDown` exception?

Cool.
2025-03-24 21:44:46 -04:00
Tyler Goodlet 90287b9875 Fix an `aio_err` ref bug 2025-03-24 21:44:09 -04:00
1 changed files with 25 additions and 9 deletions

View File

@ -23,12 +23,10 @@ import asyncio
from asyncio.exceptions import (
CancelledError,
)
from asyncio import (
QueueShutDown,
)
from contextlib import asynccontextmanager as acm
from dataclasses import dataclass
import inspect
import platform
import traceback
from typing import (
Any,
@ -79,6 +77,20 @@ __all__ = [
'run_as_asyncio_guest',
]
if (_py_313 := (
('3', '13')
==
platform.python_version_tuple()[:-1]
)
):
# 3.13+ only.. lel.
# https://docs.python.org/3.13/library/asyncio-queue.html#asyncio.QueueShutDown
from asyncio import (
QueueShutDown,
)
else:
QueueShutDown = False
# TODO, generally speaking we can generalize this abstraction, a "SC linked
# parent->child task pair", as the same "supervision scope primitive"
@ -348,7 +360,6 @@ def _run_asyncio_task(
trio_task: trio.Task = trio.lowlevel.current_task()
trio_cs = trio.CancelScope()
aio_task_complete = trio.Event()
aio_err: BaseException|None = None
chan = LinkedTaskChannel(
_to_aio=aio_q, # asyncio.Queue
@ -392,7 +403,7 @@ def _run_asyncio_task(
if (
result != orig
and
aio_err is None
chan._aio_err is None
and
# in the `open_channel_from()` case we don't
@ -576,7 +587,11 @@ def _run_asyncio_task(
# normally suppressed unless the trio.Task also errors
#
# ?TODO, is this even needed (does it happen) now?
elif isinstance(aio_err, QueueShutDown):
elif (
_py_313
and
isinstance(aio_err, QueueShutDown)
):
# import pdbp; pdbp.set_trace()
trio_err = AsyncioTaskExited(
'Task exited before `trio` side'
@ -956,9 +971,10 @@ async def translate_aio_errors(
# or an error, we ensure the aio-side gets signalled via
# an explicit exception and its `Queue` is shutdown.
if ya_trio_exited:
# raise `QueueShutDown` on next `Queue.get()` call on
# aio side.
chan._to_aio.shutdown()
# XXX py3.13+ ONLY..
# raise `QueueShutDown` on next `Queue.get/put()`
if _py_313:
chan._to_aio.shutdown()
# pump this event-loop (well `Runner` but ya)
#