v0.23.0
Full Changelog: v0.22.2...v0.23.0
Headline features
- Add type hints. (#543)
Features
- When exiting a nursery block, the parent task always waits for child tasks to exit. This wait cannot be cancelled. However, previously, if you tried to cancel it, it would inject a
Cancelled
exception, even though it wasn't cancelled. Most users probably never noticed either way, but injecting aCancelled
here is not really useful, and in some rare cases caused confusion or problems, so Trio no longer does that. (#1457) - If called from a thread spawned by
trio.to_thread.run_sync
,trio.from_thread.run
andtrio.from_thread.run_sync
now reuse the task and cancellation status of the host task; this means that context variables and cancel scopes naturally propagate 'through' threads spawned by Trio. You can also usetrio.from_thread.check_cancelled
to efficiently check for cancellation without reentering the Trio thread. (#2392) trio.lowlevel.start_guest_run
now does a bit more setup of the guest run before it returns to its caller, so that the caller can immediately make calls totrio.current_time
,trio.lowlevel.spawn_system_task
,trio.lowlevel.current_trio_token
, etc. (#2696)
Bugfixes
- When a starting function raises before calling
trio.TaskStatus.started
,trio.Nursery.start
will no longer wrap the exception in an undocumentedExceptionGroup
. Previously,trio.Nursery.start
would incorrectly raise anExceptionGroup
containing it when usingtrio.run(..., strict_exception_groups=True)
. (#2611)
Deprecations and removals
- To better reflect the underlying thread handling semantics, the keyword argument for
trio.to_thread.run_sync
that was previously calledcancellable
is now namedabandon_on_cancel
. It still does the same thing -- allow the thread to be abandoned if the call totrio.to_thread.run_sync
is cancelled -- but since we now have other ways to propagate a cancellation without abandoning the thread, "cancellable" has become somewhat of a misnomer. The oldcancellable
name is now deprecated. (#2841) - Deprecated support for
math.inf
for thebacklog
argument inopen_tcp_listeners
, making its docstring correct in the fact that onlyTypeError
is raised if invalid arguments are passed. (#2842)
Removals without deprecations
- Drop support for Python3.7 and PyPy3.7/3.8. (#2668)
- Removed special
MultiError
traceback handling for IPython. As of version 8.15ExceptionGroup
is handled natively. (#2702)
Miscellaneous internal changes
- Trio now indicates its presence to
sniffio
using thesniffio.thread_local
interface that is preferred since sniffio v1.3.0. This should be less likely than the previous approach to causesniffio.current_async_library
to return incorrect results due to unintended inheritance of contextvars. (#2700) - On windows, if SIO_BASE_HANDLE failed and SIO_BSP_HANDLE_POLL didn't return a different socket, runtime error will now raise from the OSError that indicated the issue so that in the event it does happen it might help with debugging. (#2807)