Releases: agronholm/anyio
Releases · agronholm/anyio
4.11.0
- Added support for cancellation reasons (the
reasonparameter toCancelScope.cancel()) (#975) - Bumped the minimum version of Trio to v0.31.0
- Added the ability to enter the event loop from foreign (non-worker) threads by passing the return value of
anyio.lowlevel.current_token()toanyio.from_thread.run()andanyio.from_thread.run_sync()as thetokenkeyword argument (#256) - Added pytest option (
anyio_mode = "auto") to make the pytest plugin automatically handle all async tests (#971) - Added the
anyio.Condition.wait_for()method for feature parity with asyncio (#974) - Changed the default type argument of
anyio.abc.TaskStatusfromAnytoNone(#964) - Fixed TCP listener behavior to guarantee the same ephemeral port is used for all socket listeners when
local_port=0(#857; PR by @11kkw and @agronholm) - Fixed inconsistency between Trio and asyncio where a TCP stream that previously raised a
BrokenResourceErroronsend()would still raiseBrokenResourceErrorafter the stream was closed on asyncio, butClosedResourceErroron Trio. They now both raise aClosedResourceErrorin this scenario. (#671)
4.10.0
- Added the
feed_data()method to theBufferedByteReceiveStreamclass, allowing users to inject data directly into the buffer - Added various class methods to wrap existing sockets as listeners or socket streams:
SocketListener.from_socket()SocketStream.from_socket()UNIXSocketStream.from_socket()UDPSocket.from_socket()ConnectedUDPSocket.from_socket()UNIXDatagramSocket.from_socket()ConnectedUNIXDatagramSocket.from_socket()
- Added a hierarchy of connectable stream classes for transparently connecting to various remote or local endpoints for exchanging bytes or objects
- Added context manager mix-in classes (
anyio.ContextManagerMixinandanyio.AsyncContextManagerMixin) to help write classes that embed other context managers, particularly cancel scopes or task groups (#905; PR by @agronholm and @tapetersen) - Added the ability to specify the thread name in
start_blocking_portal()(#818; PR by @davidbrochart) - Added
anyio.notify_closingto allow wakinganyio.wait_readableandanyio.wait_writablebefore closing a socket. Among other things, this prevents an OSError on theProactorEventLoop. (#896; PR by @graingert) - Incorporated several documentation improvements from the EuroPython 2025 sprint (special thanks to the sprinters: Emmanuel Okedele, Jan Murre, Euxenia Miruna Goia and Christoffer Fjord)
- Added a documentation page explaining why one might want to use AnyIO's APIs instead of asyncio's
- Updated the
to_interpretersmodule to use the publicconcurrent.interpretersAPI on Python 3.14 or later - Fixed
anyio.Path.copy()andanyio.Path.copy_into()failing on Python 3.14.0a7 - Fixed return annotation of
__aexit__on async context managers. CMs which can suppress exceptions should returnbool, orNoneotherwise. (#913; PR by @Enegg) - Fixed rollover boundary check in
SpooledTemporaryFileso that rollover only occurs when the buffer size exceedsmax_size(#915; PR by @11kkw) - Migrated testing and documentation dependencies from extras to dependency groups
- Fixed compatibility of
anyio.to_interpreterwith Python 3.14.0b2 (#926; PR by @hroncok) - Fixed
SyntaxWarningon Python 3.14 aboutreturninfinally(#816) - Fixed RunVar name conflicts. RunVar instances with the same name should not share storage (#880; PR by @vimfu)
- Renamed the
BrokenWorkerIntepreterexception toBrokenWorkerInterpreter. The old name is available as a deprecated alias. (#938; PR by @ayussh-verma) - Fixed an edge case in
CapacityLimiteron asyncio where a task, waiting to acquire a limiter gets cancelled and is subsequently granted a token from the limiter, but before the cancellation is delivered, and then fails to notify the next waiting task (#947)
4.9.0
- Added async support for temporary file handling (#344; PR by @11kkw)
- Added 4 new fixtures for the AnyIO
pytestplugin:free_tcp_port_factory: session scoped fixture returning a callable that generates unused TCP port numbersfree_udp_port_factory: session scoped fixture returning a callable that generates unused UDP port numbersfree_tcp_port: function scoped fixture that invokes thefree_tcp_port_factoryfixture to generate a free TCP port numberfree_udp_port: function scoped fixture that invokes thefree_udp_port_factoryfixture to generate a free UDP port number
- Added
stdinargument toanyio.run_process()akin to whatanyio.open_process(),asyncio.create_subprocess(),trio.run_process(), andsubprocess.run()already accept (PR by @jmehnle) - Added the
infoproperty toanyio.Pathon Python 3.14 - Changed
anyio.getaddrinfo()to ignore (invalid) IPv6 name resolution results when IPv6 support is disabled in Python - Changed
EndOfStreamraised fromMemoryObjectReceiveStream.receive()to leave out theAttributeErrorfrom the exception chain which was merely an implementation detail and caused some confusion - Fixed traceback formatting growing quadratically with level of
TaskGroupnesting on asyncio due to exception chaining when raisingExceptionGroupsinTaskGroup.__aexit__(#863; PR by @tapetersen) - Fixed
anyio.Path.iterdir()making a blocking call in Python 3.13 (#873; PR by @cbornet and @agronholm) - Fixed
connect_tcp()producing cyclic references in tracebacks when raising exceptions (#809; PR by @graingert) - Fixed
anyio.to_thread.run_sync()needlessly holding on to references of the context, function, arguments and others until the next work item on asyncio (PR by @Wankupi)
4.8.0
- Added experimental support for running functions in subinterpreters on Python 3.13 and later
- Added support for the
copy(),copy_into(),move()andmove_into()methods inanyio.Path, available in Python 3.14 - Changed
TaskGroupon asyncio to always spawn tasks non-eagerly, even if using a task factory created viaasyncio.create_eager_task_factory(), to preserve expected Trio-like task scheduling semantics (PR by @agronholm and @graingert) - Configure
SO_RCVBUF,SO_SNDBUFandTCP_NODELAYon the selector thread waker socket pair (this should improve the performance ofwait_readable()andwait_writable()when using theProactorEventLoop) (#836; PR by @graingert) - Fixed
AssertionErrorwhen usingnest-asyncio(#840) - Fixed return type annotation of various context managers'
__exit__method (#847; PR by @Enegg)
4.7.0
- Updated
TaskGroupto work with asyncio's eager task factories (#764) - Added the
wait_readable()andwait_writable()functions which will accept an object with a.fileno()method or an integer handle, and deprecated their now obsolete versions (wait_socket_readable()andwait_socket_writable()) (PR by @davidbrochart) - Changed
EventAdapter(anEventwith no bound async backend) to allowset()to work even before an async backend is bound to it (#819) - Added support for
wait_readable()andwait_writable()onProactorEventLoop(used on asyncio + Windows by default) - Fixed a misleading
ValueErrorin the context of DNS failures (#815; PR by @graingert) - Fixed the return type annotations of
readinto()andreadinto1()methods in theanyio.AsyncFileclass (#825) - Fixed
TaskInfo.has_pending_cancellation()on asyncio returning false positives in cleanup code on Python >= 3.11 (#832; PR by @gschaffner) - Fixed cancelled cancel scopes on asyncio calling
asyncio.Task.uncancelwhen propagating aCancelledErroron exit to a cancelled parent scope (#790; PR by @gschaffner)
4.6.2
4.6.1
This release contains all the changes from both v4.5.1 and v4.6.0, plus:
- Fixed TaskGroup and CancelScope producing cyclic references in tracebacks when raising exceptions (#806) (PR by @graingert)
4.5.2
4.5.1
As Python 3.8 support was dropped in v4.6.0, this interim release was created to bring a regression fix to Python 3.8, and adds a few other fixes also present in v4.6.1.
- Fixed acquring a lock twice in the same task on asyncio hanging instead of raising a
RuntimeError(#798) - Fixed an async fixture's
selfbeing different than the test'sselfin class-based tests (#633) (PR by @agronholm and @graingert) - Fixed
TypeErrorwithTLSStreamon Windows when a certificate verification error occurs when using a truststore SSL certificate (#795) - Corrected documentation on
anyio.Pathregarding the limitations imposed by the current Python version on several of its methods, and made theis_junctionmethod unavailable on Python versions earlier than 3.12 (#794)
4.6.0
- Dropped support for Python 3.8 (as #698 cannot be resolved without cancel message support)
- Fixed 100% CPU use on asyncio while waiting for an exiting task group to finish while said task group is within a cancelled cancel scope (#695)
- Fixed cancel scopes on asyncio not propagating
CancelledErroron exit when the enclosing cancel scope has been effectively cancelled (#698) - Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on
- Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running