Trio – a friendly Python library for async concurrency and I/O
Full Changelog: https://github.com/python-trio/trio/compare/v0.24.0...v0.25.0
The strict_exception_groups
parameter now defaults to True
in trio.run
and trio.lowlevel.start_guest_run
. trio.open_nursery
still defaults to the same value as was specified in trio.run
/trio.lowlevel.start_guest_run
, but if you didn't specify it there then all subsequent calls to trio.open_nursery
will change.
This is unfortunately very tricky to change with a deprecation period, as raising a DeprecationWarning
whenever strict_exception_groups
is not specified would raise a lot of unnecessary warnings.
Notable side effects of changing code to run with strict_exception_groups==True
If an iterator raises StopAsyncIteration
or StopIteration
inside a nursery, then python will not recognize wrapped instances of those for stopping iteration.
trio.run_process
is now documented that it can raise an ExceptionGroup
. It previously could do this in very rare circumstances, but with strict_exception_groups
set to True
it will now do so whenever exceptions occur in deliver_cancel
or with problems communicating with the subprocess.
strict_exception_groups=True
there are cases now where an ExceptionGroup
is no longer added.trio.TrioInternalError
.__cause__
might be wrapped in one or more ExceptionGroups <ExceptionGroup>
(https://github.com/python-trio/trio/issues/2786)
Add trio.testing.wait_all_threads_completed
, which blocks until no threads are running tasks. This is intended to be used in the same way as trio.testing.wait_all_tasks_blocked
. (https://github.com/python-trio/trio/issues/2937)
Path
is now a subclass of pathlib.PurePath
, allowing it to interoperate with other standard
pathlib
types.
Instantiating Path
now returns a concrete platform-specific subclass, one of PosixPath
or
WindowsPath
, matching the behavior of pathlib.Path
. (https://github.com/python-trio/trio/issues/2959)
Full Changelog: https://github.com/python-trio/trio/compare/v0.23.2...v0.24.0
New helper classes: testing.RaisesGroup
and testing.Matcher
.
In preparation for changing the default of strict_exception_groups
to True
, we're introducing a set of helper classes that can be used in place of pytest.raises
in tests, to check for an expected ExceptionGroup
.
These are provisional, and only planned to be supplied until there's a good solution in pytest
. See https://github.com/pytest-dev/pytest/issues/11538 (https://github.com/python-trio/trio/issues/2785)
MultiError
has been fully removed, and all relevant trio functions now raise ExceptionGroups instead. This should not affect end users that have transitioned to using except*
or catching ExceptionGroup/BaseExceptionGroup. (https://github.com/python-trio/trio/issues/2891)Full Changelog: https://github.com/python-trio/trio/compare/v0.23.1...v0.23.2
nursery.start_soon()
, trio.run()
, trio.to_thread.run_sync()
, and other similar functions accepting (func, *args)
. This means type checkers will be able to verify types are used correctly. nursery.start()
is not fully typed yet however. (https://github.com/python-trio/trio/issues/2881)open_memory_channel
as generic. (https://github.com/python-trio/trio/issues/2873)pyproject.toml
. (https://github.com/python-trio/trio/issues/2860)Full Changelog: https://github.com/python-trio/trio/compare/v0.23.0...v0.23.1
Full Changelog: https://github.com/python-trio/trio/compare/v0.22.2...v0.23.0
Cancelled
exception, even though it wasn't cancelled. Most users probably never noticed either way, but injecting a Cancelled
here is not really useful, and in some rare cases caused confusion or problems, so Trio no longer does that. (https://github.com/python-trio/trio/issues/1457)trio.to_thread.run_sync
, trio.from_thread.run
and trio.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 use trio.from_thread.check_cancelled
to efficiently check for cancellation without reentering the Trio thread. (https://github.com/python-trio/trio/issues/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 to trio.current_time
, trio.lowlevel.spawn_system_task
, trio.lowlevel.current_trio_token
, etc. (https://github.com/python-trio/trio/issues/2696)trio.TaskStatus.started
, trio.Nursery.start
will no longer wrap the exception in an undocumented ExceptionGroup
. Previously, trio.Nursery.start
would incorrectly raise an ExceptionGroup
containing it when using trio.run(..., strict_exception_groups=True)
. (https://github.com/python-trio/trio/issues/2611)trio.to_thread.run_sync
that was previously called cancellable
is now named abandon_on_cancel
. It still does the same thing -- allow the thread to be abandoned if the call to trio.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 old cancellable
name is now deprecated. (https://github.com/python-trio/trio/issues/2841)math.inf
for the backlog
argument in open_tcp_listeners
, making its docstring correct in the fact that only TypeError
is raised if invalid arguments are passed. (https://github.com/python-trio/trio/issues/2842)MultiError
traceback handling for IPython. As of version 8.15 ExceptionGroup
is handled natively. (https://github.com/python-trio/trio/issues/2702)sniffio
using the sniffio.thread_local
interface that is preferred since sniffio v1.3.0. This should be less likely than the previous approach to cause sniffio.current_async_library
to return incorrect results due to unintended inheritance of contextvars. (https://github.com/python-trio/trio/issues/2700)Full Changelog: https://github.com/python-trio/trio/compare/v0.22.1...v0.22.2
PermissionError
when importing trio
due to trying to access pthread
. (https://github.com/python-trio/trio/issues/2688)