Releases: python-trio/trio
v0.32.0
Full Changelog: v0.31.0...v0.32.0
Features
- Allow
trio.CapacityLimiterto have zero total_tokens. (#3321)
Bugfixes
- Fixed a bug where iterating over an
@as_safe_channel-derivedReceiveChannelwould raisetrio.BrokenResourceErrorif the channel was closed by another task. It now shuts down cleanly. (#3331) trio.lowlevel.Task.iter_await_framesnow works on completed tasks, by returning an empty list of frames if the underlying coroutine has been closed. Previously, it raised an internal error. (#3337)
Removals without deprecations
- Drop support for Python 3.9. (#3345)
Miscellaneous internal changes
- Decrease indentation for exception groups raised in
trio.as_safe_channel. (#3332)
v0.31.0
Full Changelog: v0.30.0...v0.31.0
Features
Cancelledstrings can now display the source and reason for a cancellation. Trio-internal sources of cancellation will set this string, andCancelScope.cancelnow has areasonstring parameter that can be used to attach info to anyCancelledto help in debugging. (#3232)
Bugfixes
- Make ctrl+c work in more situations in the Trio REPL (
python -m trio). (#3007) - Allow pickling
trio.Cancelled, as they can show up when you want to pickle something else. This does not rule out pickling otherNoPublicConstructorobjects -- create an issue if necessary. (#3248) - Decrease import time on Windows by around 10%. (#3263)
- Handle unwrapping SystemExit/KeyboardInterrupt exception gracefully in utility function
raise_single_exception_from_groupthat reraises last exception from group. (#3275) - Ensure that the DTLS server does not mutate SSL context. (#3277)
- Avoid having
trio.as_safe_channelraise if closing the generator wrapped
GeneratorExitin aBaseExceptionGroup. (#3324)
Deprecations and removals
- Implement
bool(trio.Event)and have it raise aDeprecationWarningand tell users to usetrio.Event.is_setinstead. This is an alternative tomypy --enable-error-code=truthy-boolfor users who don't use type checking. (#3322)
Miscellaneous internal changes
- When misnesting nurseries you now get a helpful
RuntimeErrorinstead of a catastrophicTrioInternalError. (#3307)
v0.30.0
Full Changelog: v0.29.0...v0.30.0
Features
- Add
@trio.as_safe_channel, a wrapper that can be used to make async generators safe.
This will be the suggested fix for the flake8-async lint ruleASYNC900. (#3197)
Bugfixes
- Allow
trioto be atypes.ModuleTypeand still have deprecated attributes. (#2135) - Fixed socket module for some older systems which lack
socket.AI_NUMERICSERV.
Now trio works on legacy (pre-Lion) macOS. (#3133) - Update type hints for
trio.run_processandtrio.lowlevel.open_process. (#3183) - Don't mutate the global runner when MockClock is created. (#3205)
- Fix incorrect return type hint for
Nursery.start(). (#3224)
Improved documentation
- Update wording in documentation to more accurately reflect Trio's maturity. (#3216)
v0.29.0
Full Changelog: v0.28.0...v0.29.0
Features
- Add
trio.lowlevel.in_trio_runandtrio.lowlevel.in_trio_taskand document the semantics (and differences) thereof. (#2757) - If
trio.testing.RaisesGroupdoes not get the expected exceptions it now raises anAssertionErrorwith a helpful message, instead of letting the raised exception/group fall through. The raised exception is available in the__context__of theAssertionErrorand can be seen in the traceback. (#3145)
Bugfixes
- Clear Trio's cache of worker threads upon
os.fork. (#2764)
Miscellaneous internal changes
-
Stop using ctypes to mutate tracebacks for
strict_exception_groups=False's exception collapsing. (#405) -
Fixed spelling error in Windows error code enum for
ERROR_INVALID_PARAMETER. (#3166) -
Publicly re-export
__version__for type checking purposes. (#3186) -
The typing of
trio.abc.HostnameResolver.getaddrinfohas been corrected to match that of the stdlibsocket.getaddrinfo, which was updated in mypy 1.15 (via a typeshed update) to include the possibility oftuple[int, bytes]for thesockaddrfield of the result. This happens in situations where Python was compiled with--disable-ipv6.Additionally, the static typing of
trio.to_thread.run_sync,trio.from_thread.runandtrio.from_thread.run_synchas been improved and should reflect the underlying function being run. (#3201)
v0.28.0
Full Changelog: v0.27.0...v0.28.0
Bugfixes
-
:func:
inspect.iscoroutinefunctionand 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_localsdictionaries, 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.iscoroutinefunctionand 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_protectionto 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_localsdictionary 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_foreveris 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_afterandtrio.fail_afterpreviously 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_deadlineandCancelScope.is_relativeadded, as well as arelative_deadlineparameter 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.Lockandtrio.StrictFIFOLockwill now raisetrio.BrokenResourceErrorwhentrio.Lock.acquirewould 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_atandtrio.fail_afternow accept shield as a keyword argument. If specified, it provides an initial value for the~trio.CancelScope.shieldattribute of thetrio.CancelScopeobject created by the context manager. (#3052)- Added
trio.lowlevel.add_parking_lot_breakerandtrio.lowlevel.remove_parking_lot_breakerto allow creating custom lock/semaphore implementations that will break their underlying parking lot if a task exits unexpectedly.trio.lowlevel.ParkingLot.break_lotis also added, to allow breaking a parking lot intentionally. (#3081)
Bugfixes
- Allow sockets to bind any
os.PathLikeobject. (#3041) - Update
trio.lowlevel.open_process's documentation to allow bytes. (#3076) - Update
trio.sleep_foreverto beNoReturn. (#3095)
Improved documentation
- Add docstrings for memory channels'
statistics()andaclosemethods. (#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 theawaitkeyword 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
hiSee interactive debugging for further detail. (#2972)
trio.testing.RaisesGroupcan 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 raisedExceptionGroupbefore flattening subgroups, leading to incorrectly failed matches.
It now properly supports end ($) regex markers in thematchmessage, by no longer including " (x sub-exceptions)" in the string it matches against. (#2989)
Deprecations and removals
- Deprecated
strictparameter fromtrio.testing.RaisesGroup, previous functionality ofstrict=Falseis now inflatten_subgroups=True. (#2989)