Releases: agronholm/anyio
4.8.0
- Added experimental support for running functions in subinterpreters on Python 3.13 and later
- Added support for the
copy()
,copy_into()
,move()
andmove_into()
methods inanyio.Path
, available in Python 3.14 - Changed
TaskGroup
on asyncio to always spawn tasks non-eagerly, even if using a task factory created viaasyncio.create_eager_task_factory()
, to preserve expected Trio-like task scheduling semantics (PR by @agronholm and @graingert) - Configure
SO_RCVBUF
,SO_SNDBUF
andTCP_NODELAY
on the selector thread waker socket pair (this should improve the performance ofwait_readable()
andwait_writable()
when using theProactorEventLoop
) (#836; PR by @graingert) - Fixed
AssertionError
when usingnest-asyncio
(#840) - Fixed return type annotation of various context managers'
__exit__
method (#847; PR by @Enegg)
4.7.0
- Updated
TaskGroup
to work with asyncio's eager task factories (#764) - Added the
wait_readable()
andwait_writable()
functions which will accept an object with a.fileno()
method or an integer handle, and deprecated their now obsolete versions (wait_socket_readable()
andwait_socket_writable()
) (PR by @davidbrochart) - Changed
EventAdapter
(anEvent
with no bound async backend) to allowset()
to work even before an async backend is bound to it (#819) - Added support for
wait_readable()
andwait_writable()
onProactorEventLoop
(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()
andreadinto1()
methods in theanyio.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 aCancelledError
on exit to a cancelled parent scope (#790; PR by @gschaffner)
4.6.2
4.6.1
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
4.5.1
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'sself
in class-based tests (#633) (PR by @agronholm and @graingert) - Fixed
TypeError
withTLSStream
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 theis_junction
method unavailable on Python versions earlier than 3.12 (#794)
4.6.0
- 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
- Improved the performance of
anyio.Lock
andanyio.Semaphore
on asyncio (even up to 50 %) - Added the
fast_acquire
parameter toanyio.Lock
andanyio.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 inanyio.Path
, newly added in Python 3.13 (#737) - Added support for more keyword arguments for
run_process()
andopen_process()
:startupinfo
,creationflags
,pass_fds
,user
,group
,extra_groups
andumask
(#742) - Improved the type annotations and support for
PathLike
inrun_process()
andopen_process()
to allow for path-like arguments, just likesubprocess.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__()
ofMemoryObjectItemReceiver
, whenitem
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()
returningbytearray
instead ofbytes
when using asyncio withProactorEventLoop
(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
- Added the
BlockingPortalProvider
class to aid with constructing synchronous counterparts to asynchronous interfaces that would otherwise require multiple blocking portals - Added
__slots__
toAsyncResource
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 thestart()
method before the first checkpoint is reached after callingtask_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 thestart()
method before the first checkpoint is reached after callingtask_status.started()
(#706; PR by Dominik Schwabe) - Fixed the entire task group being cancelled if a
TaskGroup.start()
call gets cancelled (#685, #710)
- Fixed erroneous
- 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 raisesKeyError
- Fixed the asyncio backend not respecting the
PYTHONASYNCIODEBUG
environment variable when setting thedebug
flag inanyio.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
forMemoryObjectReceiveStream
andMemoryObjectSendStream
that were garbage collected without being closed (PR by Andrey Kazantcev) - Fixed
MemoryObjectSendStream.send()
not raisingBrokenResourceError
when the last correspondingMemoryObjectReceiveStream
is closed while waiting to send a falsey item (#731; PR by Ganden Schaffner)
4.3.0
-
Added support for the Python 3.12
walk_up
keyword argument inanyio.Path.relative_to()
(PR by Colin Taylor) -
Fixed passing
total_tokens
toanyio.CapacityLimiter()
as a keyword argument not working on thetrio
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()
orrun_process()
on Trio could leave standard streams unclosed
(PR by Ganden Schaffner)
- Cancellation of
-
Fixed
Process.stdin.aclose()
,Process.stdout.aclose()
, andProcess.stderr.aclose()
not including a checkpoint on asyncio (PR by Ganden Schaffner) -
Fixed documentation on how to provide your own typed attributes