Skip to content

Releases: agronholm/anyio

4.8.0

05 Jan 13:13
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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

4.5.0

19 Sep 09:28
Compare
Choose a tag to compare
  • Improved the performance of anyio.Lock and anyio.Semaphore on asyncio (even up to 50 %)
  • Added the fast_acquire parameter to anyio.Lock and anyio.Semaphore to further boost performance at the expense of safety (acquire() will not yield control back if there is no contention)
  • Added support for the from_uri(), full_match(), parser methods/properties in anyio.Path, newly added in Python 3.13 (#737)
  • Added support for more keyword arguments for run_process() and open_process(): startupinfo, creationflags, pass_fds, user, group, extra_groups and umask (#742)
  • Improved the type annotations and support for PathLike in run_process() and open_process() to allow for path-like arguments, just like subprocess.Popen
  • Changed the ResourceWarning from an unclosed memory object stream to include its address for easier identification
  • Changed start_blocking_portal() to always use daemonic threads, to accommodate the "loitering event loop" use case
  • Bumped the minimum version of Trio to v0.26.1
  • Fixed __repr__() of MemoryObjectItemReceiver, when item is not defined (#767; PR by @Danipulok)
  • Fixed to_process.run_sync() failing to initialize if __main__.__file__ pointed to a file in a nonexistent directory (#696)
  • Fixed AssertionError: feed_data after feed_eof on asyncio when a subprocess is closed early, before its output has been read (#490)
  • Fixed TaskInfo.has_pending_cancellation() on asyncio not respecting shielded scopes (#771; PR by @gschaffner)
  • Fixed SocketStream.receive() returning bytearray instead of bytes when using asyncio with ProactorEventLoop (Windows) (#776)
  • Fixed quitting the debugger in a pytest test session while in an active task group failing the test instead of exiting the test session (because the exit exception arrives in an exception group)
  • Fixed support for Linux abstract namespaces in UNIX sockets that was broken in v4.2 (#781; PR by @tapetersen)
  • Fixed KeyboardInterrupt (ctrl+c) hanging the asyncio pytest runner

4.4.0

26 May 22:02
Compare
Choose a tag to compare
  • Added the BlockingPortalProvider class to aid with constructing synchronous counterparts to asynchronous interfaces that would otherwise require multiple blocking portals
  • Added __slots__ to AsyncResource so that child classes can use __slots__ (#733; PR by Justin Su)
  • Added the TaskInfo.has_pending_cancellation() method
  • Fixed erroneous RuntimeError: called 'started' twice on the same task status when cancelling a task in a TaskGroup created with the start() method before the first checkpoint is reached after calling task_status.started() (#706; PR by Dominik Schwabe)
  • Fixed two bugs with TaskGroup.start() on asyncio:
    • Fixed erroneous RuntimeError: called 'started' twice on the same task status when cancelling a task in a TaskGroup created with the start() method before the first checkpoint is reached after calling task_status.started() (#706; PR by Dominik Schwabe)
    • Fixed the entire task group being cancelled if a TaskGroup.start() call gets cancelled (#685, #710)
  • Fixed a race condition that caused crashes when multiple event loops of the same backend were running in separate threads and simultaneously attempted to use AnyIO for their first time (#425; PR by David Jiricek and Ganden Schaffner)
  • Fixed cancellation delivery on asyncio incrementing the wrong cancel scope's cancellation counter when cascading a cancel operation to a child scope, thus failing to uncancel the host task (#716)
  • Fixed erroneous TypedAttributeLookupError if a typed attribute getter raises KeyError
  • Fixed the asyncio backend not respecting the PYTHONASYNCIODEBUG environment variable when setting the debug flag in anyio.run()
  • Fixed SocketStream.receive() not detecting EOF on asyncio if there is also data in the read buffer (#701)
  • Fixed MemoryObjectStream dropping an item if the item is delivered to a recipient that is waiting to receive an item but has a cancellation pending (#728)
  • Emit a ResourceWarning for MemoryObjectReceiveStream and MemoryObjectSendStream that were garbage collected without being closed (PR by Andrey Kazantcev)
  • Fixed MemoryObjectSendStream.send() not raising BrokenResourceError when the last corresponding MemoryObjectReceiveStream is closed while waiting to send a falsey item (#731; PR by Ganden Schaffner)

4.3.0

19 Feb 08:36
Compare
Choose a tag to compare
  • Added support for the Python 3.12 walk_up keyword argument in anyio.Path.relative_to() (PR by Colin Taylor)

  • Fixed passing total_tokens to anyio.CapacityLimiter() as a keyword argument not working on the trio backend (#515)

  • Fixed Process.aclose() not performing the minimum level of necessary cleanup when cancelled. Previously:

    • Cancellation of Process.aclose() could leak an orphan process
    • Cancellation of run_process() could very briefly leak an orphan process.
    • Cancellation of Process.aclose() or run_process() on Trio could leave standard streams unclosed

    (PR by Ganden Schaffner)

  • Fixed Process.stdin.aclose(), Process.stdout.aclose(), and Process.stderr.aclose() not including a checkpoint on asyncio (PR by Ganden Schaffner)

  • Fixed documentation on how to provide your own typed attributes