anyio 4.10.0

4.10.0
Added 7
  • Add the `feed_data()` method to the `BufferedByteReceiveStream` class to inject data directly into the buffer
  • Add class methods `from_socket()` to `SocketListener`, `SocketStream`, `UNIXSocketStream`, `UDPSocket`, `ConnectedUDPSocket`, `UNIXDatagramSocket`, and `ConnectedUNIXDatagramSocket` to wrap existing sockets
  • Add a hierarchy of connectable stream classes for transparently connecting to various remote or local endpoints for exchanging bytes or objects
  • Add context manager mix-in classes `anyio.ContextManagerMixin` and `anyio.AsyncContextManagerMixin` to help write classes that embed other context managers
  • Add the ability to specify the thread name in `start_blocking_portal()`
  • Add `anyio.notify_closing` to allow waking `anyio.wait_readable` and `anyio.wait_writable` before closing a socket
  • Add a documentation page explaining why one might want to use AnyIO's APIs instead of asyncio's
Changed 1
  • Update the `to_interpreters` module to use the public `concurrent.interpreters` API on Python 3.14 or later
Fixed 7
  • Fix `anyio.Path.copy()` and `anyio.Path.copy_into()` failing on Python 3.14.0a7
  • Fix return annotation of `__aexit__` on async context managers to return `bool` when suppressing exceptions or `None` otherwise
  • Fix rollover boundary check in `SpooledTemporaryFile` so that rollover only occurs when the buffer size exceeds `max_size`
  • Fix compatibility of `anyio.to_interpreter` with Python 3.14.0b2
  • Fix `SyntaxWarning` on Python 3.14 about `return` in `finally`
  • Fix RunVar name conflicts so that RunVar instances with the same name do not share storage
  • Fix an edge case in `CapacityLimiter` on asyncio where a cancelled task is subsequently granted a token but fails to notify the next waiting task
Deprecated 1
  • Deprecate the `BrokenWorkerIntepreter` exception name in favor of `BrokenWorkerInterpreter`
  • 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)
View original

Upgraded? How did it go?

Discussion