Trio Versions Save

Trio – a friendly Python library for async concurrency and I/O

v0.25.0

2 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.24.0...v0.25.0

Breaking changes

  • 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.

      • Errors in opening the process is now done outside the internal nursery, so if code previously ran with 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)

Features

  • 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)

Bugfixes

Miscellaneous internal changes

v0.24.0

4 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.23.2...v0.24.0

Features

Deprecations and removals

  • 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)

v0.23.2

5 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.23.1...v0.23.2

Features

  • TypeVarTuple is now used to fully type 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)

Bugfixes

Miscellaneous internal changes

v0.23.1

6 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.23.0...v0.23.1

Bugfixes

v0.23.0

6 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.22.2...v0.23.0

Headline features

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 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)
  • If called from a thread spawned by 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)

Bugfixes

  • When a starting function raises before calling 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)

Deprecations and removals

  • To better reflect the underlying thread handling semantics, the keyword argument for 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)
  • Deprecated support for 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)

Removals without deprecations

Miscellaneous internal changes

  • Trio now indicates its presence to 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)
  • 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. (https://github.com/python-trio/trio/issues/2807)

v0.22.2

10 months ago

Full Changelog: https://github.com/python-trio/trio/compare/v0.22.1...v0.22.2

Bugfixes