Skip to content

Releases: agronholm/anyio

4.11.0

23 Sep 09:18

Choose a tag to compare

  • Added support for cancellation reasons (the reason parameter to CancelScope.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() to anyio.from_thread.run() and anyio.from_thread.run_sync() as the token keyword 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.TaskStatus from Any to None (#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 BrokenResourceError on send() would still raise BrokenResourceError after the stream was closed on asyncio, but ClosedResourceError on Trio. They now both raise a ClosedResourceError in this scenario. (#671)

4.10.0

04 Aug 08:54

Choose a tag to compare

  • Added the feed_data() method to the BufferedByteReceiveStream class, 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.ContextManagerMixin and anyio.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_closing to allow waking anyio.wait_readable and anyio.wait_writable before closing a socket. Among other things, this prevents an OSError on the ProactorEventLoop. (#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_interpreters module to use the public concurrent.interpreters API on Python 3.14 or later
  • Fixed anyio.Path.copy() and anyio.Path.copy_into() failing on Python 3.14.0a7
  • Fixed return annotation of __aexit__ on async context managers. CMs which can suppress exceptions should return bool, or None otherwise. (#913; PR by @Enegg)
  • Fixed rollover boundary check in SpooledTemporaryFile so that rollover only occurs when the buffer size exceeds max_size (#915; PR by @11kkw)
  • Migrated testing and documentation dependencies from extras to dependency groups
  • Fixed compatibility of anyio.to_interpreter with Python 3.14.0b2 (#926; PR by @hroncok)
  • Fixed SyntaxWarning on Python 3.14 about return in finally (#816)
  • Fixed RunVar name conflicts. RunVar instances with the same name should not share storage (#880; PR by @vimfu)
  • Renamed the BrokenWorkerIntepreter exception to BrokenWorkerInterpreter. The old name is available as a deprecated alias. (#938; PR by @ayussh-verma)
  • Fixed an edge case in CapacityLimiter on 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

17 Mar 00:03

Choose a tag to compare

  • Added async support for temporary file handling (#344; PR by @11kkw)
  • Added 4 new fixtures for the AnyIO pytest plugin:
    • free_tcp_port_factory: session scoped fixture returning a callable that generates unused TCP port numbers
    • free_udp_port_factory: session scoped fixture returning a callable that generates unused UDP port numbers
    • free_tcp_port: function scoped fixture that invokes the free_tcp_port_factory fixture to generate a free TCP port number
    • free_udp_port: function scoped fixture that invokes the free_udp_port_factory fixture to generate a free UDP port number
  • Added stdin argument to anyio.run_process() akin to what anyio.open_process(), asyncio.create_subprocess(), trio.run_process(), and subprocess.run() already accept (PR by @jmehnle)
  • Added the info property to anyio.Path on Python 3.14
  • Changed anyio.getaddrinfo() to ignore (invalid) IPv6 name resolution results when IPv6 support is disabled in Python
  • Changed EndOfStream raised from MemoryObjectReceiveStream.receive() to leave out the AttributeError from the exception chain which was merely an implementation detail and caused some confusion
  • Fixed traceback formatting growing quadratically with level of TaskGroup nesting on asyncio due to exception chaining when raising ExceptionGroups in TaskGroup.__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

05 Jan 13:13

Choose a tag to compare

  • Added experimental support for running functions in subinterpreters on Python 3.13 and later
  • Added support for the copy(), copy_into(), move() and move_into() methods in anyio.Path, available in Python 3.14
  • Changed TaskGroup on asyncio to always spawn tasks non-eagerly, even if using a task factory created via asyncio.create_eager_task_factory(), to preserve expected Trio-like task scheduling semantics (PR by @agronholm and @graingert)
  • Configure SO_RCVBUF, SO_SNDBUF and TCP_NODELAY on the selector thread waker socket pair (this should improve the performance of wait_readable() and wait_writable() when using the ProactorEventLoop) (#836; PR by @graingert)
  • Fixed AssertionError when using nest-asyncio (#840)
  • Fixed return type annotation of various context managers' __exit__ method (#847; PR by @Enegg)

4.7.0

05 Dec 15:42

Choose a tag to compare

  • Updated TaskGroup to work with asyncio's eager task factories (#764)
  • Added the wait_readable() and wait_writable() functions which will accept an object with a .fileno() method or an integer handle, and deprecated their now obsolete versions (wait_socket_readable() and wait_socket_writable()) (PR by @davidbrochart)
  • Changed EventAdapter (an Event with no bound async backend) to allow set() to work even before an async backend is bound to it (#819)
  • Added support for wait_readable() and wait_writable() on ProactorEventLoop (used on asyncio + Windows by default)
  • Fixed a misleading ValueError in the context of DNS failures (#815; PR by @graingert)
  • Fixed the return type annotations of readinto() and readinto1() methods in the anyio.AsyncFile class (#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.uncancel when propagating a CancelledError on exit to a cancelled parent scope (#790; PR by @gschaffner)

4.6.2

13 Oct 22:20

Choose a tag to compare

  • Fixed regression caused by (#807) that prevented the use of parametrized async fixtures

4.6.1

13 Oct 15:57

Choose a tag to compare

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

13 Oct 22:17

Choose a tag to compare

  • Fixed regression caused by (#807) that prevented the use of parametrized async fixtures.

4.5.1

13 Oct 15:53

Choose a tag to compare

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 self being different than the test's self in class-based tests (#633) (PR by @agronholm and @graingert)
  • Fixed TypeError with TLSStream on Windows when a certificate verification error occurs when using a truststore SSL certificate (#795)
  • Corrected documentation on anyio.Path regarding the limitations imposed by the current Python version on several of its methods, and made the is_junction method unavailable on Python versions earlier than 3.12 (#794)

4.6.0

21 Sep 10:33

Choose a tag to compare

  • 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 CancelledError on 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