Releases: python-trio/trio
v0.28.0
Full Changelog: v0.27.0...v0.28.0
Bugfixes
-
:func:
inspect.iscoroutinefunction
and the like now give correct answers when
called on KI-protected functions. (#2670) -
Rework KeyboardInterrupt protection to track code objects, rather than frames,
as protected or not. The new implementation no longer needs to access
frame.f_locals
dictionaries, so it won't artificially extend the lifetime of
local variables. Since KeyboardInterrupt protection is now imposed statically
(when a protected function is defined) rather than each time the function runs,
its previously-noticeable performance overhead should now be near zero.
The lack of a call-time wrapper has some other benefits as well:-
:func:
inspect.iscoroutinefunction
and the like now give correct answers when
called on KI-protected functions. -
Calling a synchronous KI-protected function no longer pushes an additional stack
frame, so tracebacks are clearer. -
A synchronous KI-protected function invoked from C code (such as a weakref
finalizer) is now guaranteed to start executing; previously there would be a brief
window in which KeyboardInterrupt could be raised before the protection was
established.
One minor drawback of the new approach is that multiple instances of the same
closure share a single KeyboardInterrupt protection state (because they share a
single code object). That means that if you apply
trio.lowlevel.enable_ki_protection
to some of them
and not others, you won't get the protection semantics you asked for. See the
documentation oftrio.lowlevel.enable_ki_protection
for more details and a workaround. (#3108) -
-
Rework foreign async generator finalization to track async generator
ids rather than mutatingag_frame.f_locals
. This fixes an issue
with the previous implementation: locals' lifetimes will no longer be
extended by materialization in theag_frame.f_locals
dictionary that
the previous finalization dispatcher logic needed to access to do its work. (#3112) -
Ensure that Pyright recognizes our underscore prefixed attributes for attrs classes. (#3114)
-
Fix
trio.testing.RaisesGroup
's typing. (#3141)
Improved documentation
- Improve error message when run after gevent's monkey patching. (#3087)
- Document that
trio.sleep_forever
is guaranteed to raise an exception now. (#3113)
Removals without deprecations
- Remove workaround for OpenSSL 1.1.1 DTLS ClientHello bug. (#3097)
- Drop support for Python 3.8. (#3104) (#3106)
Miscellaneous internal changes
v0.27.0
Full Changelog: v0.26.2...v0.27.0
Breaking changes
trio.move_on_after
andtrio.fail_after
previously set the deadline relative to initialization time, instead of more intuitively upon entering the context manager. This might change timeouts if a program relied on this behavior. If you want to restore previous behavior you should instead usetrio.move_on_at(trio.current_time() + ...)
.
flake8-async has a new rule to catch this, in case you're supporting older trio versions. SeeASYNC122
. (#2512)
Features
CancelScope.relative_deadline
andCancelScope.is_relative
added, as well as arelative_deadline
parameter to__init__
. This allows initializing scopes ahead of time, but where the specified relative deadline doesn't count down until the scope is entered. (#2512)trio.Lock
andtrio.StrictFIFOLock
will now raisetrio.BrokenResourceError
whentrio.Lock.acquire
would previously stall due to the owner of the lock exiting without releasing the lock. (#3035)trio.move_on_at
,trio.move_on_after
,trio.fail_at
andtrio.fail_after
now accept shield as a keyword argument. If specified, it provides an initial value for the~trio.CancelScope.shield
attribute of thetrio.CancelScope
object created by the context manager. (#3052)- Added
trio.lowlevel.add_parking_lot_breaker
andtrio.lowlevel.remove_parking_lot_breaker
to allow creating custom lock/semaphore implementations that will break their underlying parking lot if a task exits unexpectedly.trio.lowlevel.ParkingLot.break_lot
is also added, to allow breaking a parking lot intentionally. (#3081)
Bugfixes
- Allow sockets to bind any
os.PathLike
object. (#3041) - Update
trio.lowlevel.open_process
's documentation to allow bytes. (#3076) - Update
trio.sleep_forever
to beNoReturn
. (#3095)
Improved documentation
- Add docstrings for memory channels'
statistics()
andaclose
methods. (#3101)
v0.26.2
v0.26.1
v0.26.0
Full Changelog: v0.25.1...v0.26.0
Features
-
Added an interactive interpreter
python -m trio
.This makes it easier to try things and experiment with trio in the a Python repl.
Use theawait
keyword without needing to calltrio.run()
$ python -m trio
Trio 0.26.0, Python 3.10.6
Use "await" directly instead of "trio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import trio
>>> await trio.sleep(1); print("hi") # prints after one second
hi
See interactive debugging for further detail. (#2972)
trio.testing.RaisesGroup
can now catch an unwrapped exception withunwrapped=True
. This means that the behaviour ofexcept*
can be fully replicated in combination withflatten_subgroups=True
(formerlystrict=False
). (#2989)
Bugfixes
- Fixed a bug where
trio.testing.RaisesGroup(..., strict=False)
would check the number of exceptions in the raisedExceptionGroup
before flattening subgroups, leading to incorrectly failed matches.
It now properly supports end ($
) regex markers in thematch
message, by no longer including " (x sub-exceptions)" in the string it matches against. (#2989)
Deprecations and removals
- Deprecated
strict
parameter fromtrio.testing.RaisesGroup
, previous functionality ofstrict=False
is now inflatten_subgroups=True
. (#2989)
v0.25.1
v0.25.0
Full Changelog: v0.24.0...v0.25.0
Breaking changes
-
The
strict_exception_groups
parameter now defaults toTrue
intrio.run
andtrio.lowlevel.start_guest_run
.trio.open_nursery
still defaults to the same value as was specified intrio.run
/trio.lowlevel.start_guest_run
, but if you didn't specify it there then all subsequent calls totrio.open_nursery
will change.
This is unfortunately very tricky to change with a deprecation period, as raising aDeprecationWarning
wheneverstrict_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
orStopIteration
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 anExceptionGroup
. It previously could do this in very rare circumstances, but withstrict_exception_groups
set toTrue
it will now do so whenever exceptions occur indeliver_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 anExceptionGroup
is no longer added.
- Errors in opening the process is now done outside the internal nursery, so if code previously ran with
-
trio.TrioInternalError
.__cause__
might be wrapped in one or moreExceptionGroups <ExceptionGroup>
(#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 astrio.testing.wait_all_tasks_blocked
. (#2937) -
Path
is now a subclass ofpathlib.PurePath
, allowing it to interoperate with other standard
pathlib
types.Instantiating
Path
now returns a concrete platform-specific subclass, one ofPosixPath
or
WindowsPath
, matching the behavior ofpathlib.Path
. (#2959)
Bugfixes
- The pthread functions are now correctly found on systems using vanilla versions of musl libc. (#2939)
Miscellaneous internal changes
- use the regular readme for the PyPI long_description (#2866)
v0.24.0
Full Changelog: v0.23.2...v0.24.0
Features
-
New helper classes:
testing.RaisesGroup
andtesting.Matcher
.In preparation for changing the default of
strict_exception_groups
toTrue
, we're introducing a set of helper classes that can be used in place ofpytest.raises
in tests, to check for an expectedExceptionGroup
.
These are provisional, and only planned to be supplied until there's a good solution inpytest
. See pytest-dev/pytest#11538 (#2785)
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 usingexcept*
or catching ExceptionGroup/BaseExceptionGroup. (#2891)
v0.23.2
Full Changelog: 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. (#2881)
Bugfixes
- Make pyright recognize
open_memory_channel
as generic. (#2873)