Releases: agronholm/anyio
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
4.2.0
-
Add support for
byte
-based paths inconnect_unix
,create_unix_listeners
,create_unix_datagram_socket
, andcreate_connected_unix_datagram_socket
. (PR by Lura Skye) -
Enabled the
Event
andCapacityLimiter
classes to be instantiated outside an event loop thread -
Broadly improved/fixed the type annotations. Among other things, many functions and methods that take variadic positional arguments now make use of PEP 646
TypeVarTuple
to allow the positional arguments to be validated by static type checkers. These changes affected numerous methods and functions, including:anyio.run()
TaskGroup.start_soon()
anyio.from_thread.run()
anyio.from_thread.run_sync()
anyio.to_thread.run_sync()
anyio.to_process.run_sync()
BlockingPortal.call()
BlockingPortal.start_task_soon()
BlockingPortal.start_task()
(also resolves #560)
-
Fixed various type annotations of
anyio.Path
to match Typeshed:anyio.Path.__lt__()
anyio.Path.__le__()
anyio.Path.__gt__()
anyio.Path.__ge__()
anyio.Path.__truediv__()
anyio.Path.__rtruediv__()
anyio.Path.hardlink_to()
anyio.Path.samefile()
anyio.Path.symlink_to()
anyio.Path.with_segments()
(PR by Ganden Schaffner)
-
Fixed adjusting the total number of tokens in a
CapacityLimiter
on asyncio failing to wake up tasks waiting to acquire the limiter in certain edge cases (fixed with help from Egor Blagov) -
Fixed
loop_factory
anduse_uvloop
options not being used on the asyncio backend (#643) -
Fixed cancellation propagating on asyncio from a task group to child tasks if the task hosting the task group is in a shielded cancel scope (#642)