# anyio 4.15.0 - Product: anyio (https://whatsnew.fyi/product/anyio) - Vendor: agronholm - Date: 2026-09-02 - Version: 4.15.0 - Original notes: https://github.com/agronholm/anyio/releases/tag/4.15.0 - Permalink: https://whatsnew.fyi/product/anyio/releases/4.15.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Support for the `follow_symlinks` keyword-only argument on `anyio.Path.exists()` (Python 3.12+) - **added** — Support for the `follow_symlinks` keyword-only argument on `anyio.Path.is_dir()` (Python 3.13+) - **added** — Support for the `follow_symlinks` keyword-only argument on `anyio.Path.is_file()` (Python 3.13+) - **added** — Support for the `follow_symlinks` keyword-only argument on `anyio.Path.owner()` (Python 3.13+) - **added** — Support for the `follow_symlinks` keyword-only argument on `anyio.Path.group()` (Python 3.13+) - **added** — Support for the `newline` keyword-only argument on `anyio.Path.read_text()` (Python 3.13+) - **added** — Added `amap`, `gather`, and `as_completed` utility functions to simplify common patterns - **added** — Added `--anyio-mode` command-line option as an alternative to the `anyio_mode` ini setting - **added** — Added the `anyio.Future` synchronization primitive which behaves similar to `asyncio.Future` - **added** — Added `StapledObjectStream.send_nowait()` that delegates to the underlying `ObjectSendStream`, if it implements it - **added** — Added the `move_on_at()` and `fail_at()` functions to complement `move_on_after()` and `fail_after()` - **added** — Added a `reason` parameter to `fail_after` and the new `fail_at` allowing for added exception context when raising `TimeoutError` - **changed** — Changed the default name for a task spawned with `TaskGroup.create_task()` to match the default task name for the analogous task spawned with `TaskGroup.start_soon()` or `TaskGroup.start()` in more situations - **changed** — Changed the `anyio` and `anyio.abc` modules to lazily import the necessary submodules using AST parsing of the `if TYPE_CHECKING:` block - **changed** — Fixed the pytest plugin's auto mode detection to recognize the mode when set via either `--anyio-mode` or `anyio_mode` ini setting - **fixed** — Fixed free-threading compatibility issues on Python 3.14 free-threading builds where newly created threads inherit the current context by default - **fixed** — Fixed `SpooledTemporaryFile.readinto()` and `readinto1()` reading twice before rollover, causing data loss - **fixed** — Fixed the default `TaskHandle.name` missing part of the task name for tasks started with `TaskGroup.start` on Trio - **fixed** — Fixed `anyio.run` leaking or delaying collection of loop and root_task due to the root task being cached in a `RunVar` - Added support for the newer keyword-only arguments on `anyio.Path` methods to match the standard library `pathlib.Path`: - `follow_symlinks` on `exists()` (Python 3.12+) - `follow_symlinks` on `is_dir()` (Python 3.13+) - `follow_symlinks` on `is_file()` (Python 3.13+) - `follow_symlinks` on `owner()` (Python 3.13+) - `follow_symlinks` on `group()` (Python 3.13+) - `newline` on `read_text()` (Python 3.13+) ([\#1286](https://github.com/agronholm/anyio/pull/1286), [\#1293](https://github.com/agronholm/anyio/pull/1293); PR by @jaideeppyne) - Added `amap`, `gather`, and `as_completed` utility functions to simplify common patterns ([\#1173](https://github.com/agronholm/anyio/pull/1173); PR by @Graeme22) - Added `--anyio-mode` command-line option as an alternative to the `anyio_mode` ini setting, and fix the pytest plugin's auto mode detection to recognize the mode when set via either mechanism(e.g: `pytest_asyncio`). ([\#1242](https://github.com/agronholm/anyio/pull/1242); PR by @EmmanuelNiyonshuti) - Added the `anyio.Future` synchronization primitive which behaves similar to `asyncio.Future`, allowing tasks to wait for a value (or exception) from another task ([\#1146](https://github.com/agronholm/anyio/pull/1146); PR by @Vizonex) - Added guidance for managing multiple memory object stream producers and consumers with cloned streams ([\#330](https://github.com/agronholm/anyio/issues/330); PR by @nightcityblade) - Added `StapledObjectStream.send_nowait()` that delegates to the underlying `ObjectSendStream`, if it implements it ([\#1241](https://github.com/agronholm/anyio/pull/1241); PR by @davidbrochart) - Added the `move_on_at()` and `fail_at()` functions to complement `move_on_after()` and `fail_after()` - Changed the default name for a task spawned with `TaskGroup.create_task(func())` to match the default task name for the analogous task spawned with `TaskGroup.start_soon(func)` or `TaskGroup.start(func)` in more situations. Previously, the default name of a `TaskGroup.create_task` task never included the module name. (The default name for a task spawned with `TaskGroup.start_soon` or `TaskGroup.start` typically includes the module name.) ([\#1234](https://github.com/agronholm/anyio/pull/1234); PR by @gschaffner) - Changed the `anyio` and `anyio.abc` modules to lazily (much like `810`) import the necessary submodules. This is done by parsing the AST of the module and building a lookup table from the `if TYPE_CHECKING:` block. A fallback mode has been provided for installations where the source code is unavailable (e.g. PyInstaller). ([\#1169](https://github.com/agronholm/anyio/pull/1169)) - Fixed free-threading compatibility issues arising from the fact that on Python 3.14 free-threading builds, newly created threads inherit the current context by default, causing AnyIO to behave erroneously in relation to `start_blocking_portal()` and `anyio.to_thread.run_sync()` ([\#1224](https://github.com/agronholm/anyio/pull/1224); PR by @EmmanuelNiyonshuti) - Fixed `SpooledTemporaryFile.readinto()` and `readinto1()` reading twice before rollover, so the destination buffer was overwritten by the second read and the file position advanced twice, silently losing data ([\#1215](https://github.com/agronholm/anyio/pull/1215); PR by @c-tonneslan) - Added a `reason` parameter to `fail_after` (and the new `fail_at`) allowing for added exception context when raising `TimeoutError` ([\#1227](https://github.com/agronholm/anyio/pull/1227); PR by @Graeme22) - Fixed the default `TaskHandle.name` missing part of the task name for tasks started with `TaskGroup.start` on Trio ([\#1231](https://github.com/agronholm/anyio/issues/1231); PR by @gschaffner) - Fixed `anyio.run` leaking, or at least, delaying collection of loop and root_task due to the root task being cached in a `RunVar`. ([\#1203](https://github.com/agronholm/anyio/issues/1203); PR by @tapetersen) - Fixed `anyio.Path.with_stem()` silently producing a wrong path (e. _[Truncated at 4000 characters — full notes: https://github.com/agronholm/anyio/releases/tag/4.15.0]_