Releases: agronholm/anyio
Releases · agronholm/anyio
4.12.1
4.12.0
- Added support for asyncio's task call graphs on Python 3.14 and later when using AnyIO's task groups (#1025)
- Added an asynchronous implementation of the
functoolsmodule (#1001) - Added support for
uvloop=Trueon Windows via the winloop implementation (#960; PR by @Vizonex) - Added support for use as a context manager to
anyio.lowlevel.RunVar(#1003) - Added
__all__declarations to public submodules (anyio.lowleveletc.) (#1009) - Added the ability to set the token count of a
CapacityLimiterto zero (#1019; requires Python 3.10 or later when using Trio) - Added parameters
case_sensitiveandrecurse_symlinksalong with support for path-like objects toanyio.Path.glob()andanyio.Path.rglob()(#1033; PR by @NorthIsUp) - Dropped
sniffioas a direct dependency and added theget_available_backends()function (#1021) - Fixed
Process.stdin.send()not raisingClosedResourceErrorandBrokenResourceErroron asyncio. Previously, a non-AnyIO exception was raised in such cases (#671; PR by @gschaffner) - Fixed
Process.stdin.send()not checkpointing before writing data on asyncio (#1002; PR by @gschaffner) - Fixed a race condition where cancelling a
FuturefromBlockingPortal.start_task_soon()would sometimes not cancel the async function (#1011; PR by @gschaffner) - Fixed the presence of the pytest plugin causing breakage with older versions of pytest (<= 6.1.2) (#1028; PR by @saper)
- Fixed a rarely occurring
RuntimeError: Set changed size during iterationwhile shutting down the process pool when using the asyncio backend (#985)
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)