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 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)