-
Notifications
You must be signed in to change notification settings - Fork 141
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
100% CPU load after cancel #695
Comments
Infinite call recursion in anyio/src/anyio/_backends/_asyncio.py Line 469 in e0529a3
|
Without SIGINT: #!/usr/bin/env python3
from anyio import CancelScope, create_task_group, run, sleep
async def shield_task() -> None:
with CancelScope(shield=True):
await sleep(60)
async def task() -> None:
async with create_task_group() as tg:
tg.start_soon(shield_task)
async def main() -> None:
async with create_task_group() as tg:
tg.start_soon(task)
tg.cancel_scope.cancel()
run(main) |
I can repro this too. But infinite call recursion? How do you figure that? |
Yeah, not infinite call recursion. The top level cancel scope continuously retries cancellation because it only sees that its immediate child task ( |
You can see the same behavior by modifying the async def main() -> None:
async with create_task_group() as tg:
tg.start_soon(task)
await wait_all_tasks_blocked()
tg.cancel_scope.cancel() |
The trick is, I suppose, how to make it figure out that it shouldn't try to cancel the middle task which is waiting on the task which is in a shielded scope. |
Has anyone found a fix for this? We ran into it and it's killing our services. Currently looking at moving to Trio to avoid it |
Can you describe your use case where it's doing this? |
It's in a fairly complex Starlette app so it's hard to point to one thing, but it seems to be happening for us with HTTPX cancelations (among potential other things) inside of other cancel scopes. We noticed services in our cluster starting to get pinned to 100% CPU usage, and investigated. After a lot of digging, we realized that even after all open requests closed, there were still tasks in the event loop that should have already been cancelled. They weren't things we expected to use much/any CPU. It was, in all the cases we reproduced, HTTP calls. However, that's the main thing that the service was doing in our reproduction so its possible other codepaths which get cancelled/timed out would have similar issues. It mainly seems to happen when the event loop is overloaded, so it's possibly some kind of race-condition with cancellation (in our specific case) that triggers us getting into this state, but the actual end state looks like its the same as this (an orphaned cancelling task that consumes all of the CPU). |
I'll try to get a fix for this into the next release, but I have to say it's a pretty tricky one to fix. |
My best attempt at fixing this involved shielding the part of |
Regrettably I wasn't able to devise a fix for this in time for the v4.4.0 release which I had to put out as it had a veritable ton of fixes that needed to get released. I believe that this needs to be fixed in tandem with #698. |
We ended up moving to Trio to avoid this, so this is no longer urgent for us. |
is there any progress on solving this problem? Is this planned for v4.5.0, or will it be delayed? |
This is the issue holding back the 4.5.0 release. I've made progress locally by wrapping the critical part of |
I've started working on a joint fix for this and #698, as they apparently cannot be solved separately without breaking existing tests. The complexity is mind boggling, however, so please be understanding as I work through this :) |
I can report some progress: all task group tests now pass on Python 3.9. 4 tests still fail on 3.8 due to lack of cancel messages, but I'm trying to work around the problem. |
I believe I've exhausted every available avenue for making this work on Python 3.8. I could work around the problem if it was just about Python code, but asyncio's C API is rigid and unyielding and resists all my attempts to make this work right. Given the impending EOL date of Python 3.8 in October, I'm going to save myself the trouble and just make Python 3.9 the minimum required version. |
Ok, I finally have a working fix. Now it's just a matter of getting all these PRs reviewed and merged. |
I decided to release v4.5.0 without this fix, as it requires dropping support for Python 3.8. I will release v4.5.1 as soon as it gets merged though. |
Bumps [anyio](https://github.com/agronholm/anyio) from 4.4.0 to 4.6.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/releases">anyio's releases</a>.</em></p> <blockquote> <h2>4.6.0</h2> <ul> <li>Dropped support for Python 3.8 (as <a href="https://redirect.github.com/agronholm/anyio/issues/698">#698</a> cannot be resolved without cancel message support)</li> <li>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 (<a href="https://redirect.github.com/agronholm/anyio/issues/695">#695</a>)</li> <li>Fixed cancel scopes on asyncio not propagating <code>CancelledError</code> on exit when the enclosing cancel scope has been effectively cancelled (<a href="https://redirect.github.com/agronholm/anyio/issues/698">#698</a>)</li> <li>Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on</li> <li>Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running</li> </ul> <h2>4.5.0</h2> <ul> <li>Improved the performance of <code>anyio.Lock</code> and <code>anyio.Semaphore</code> on asyncio (even up to 50 %)</li> <li>Added the <code>fast_acquire</code> parameter to <code>anyio.Lock</code> and <code>anyio.Semaphore</code> to further boost performance at the expense of safety (<code>acquire()</code> will not yield control back if there is no contention)</li> <li>Added support for the <code>from_uri()</code>, <code>full_match()</code>, <code>parser</code> methods/properties in <code>anyio.Path</code>, newly added in Python 3.13 (<a href="https://redirect.github.com/agronholm/anyio/issues/737">#737</a>)</li> <li>Added support for more keyword arguments for <code>run_process()</code> and <code>open_process()</code>: <code>startupinfo</code>, <code>creationflags</code>, <code>pass_fds</code>, <code>user</code>, <code>group</code>, <code>extra_groups</code> and <code>umask</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/742">#742</a>)</li> <li>Improved the type annotations and support for <code>PathLike</code> in <code>run_process()</code> and <code>open_process()</code> to allow for path-like arguments, just like <code>subprocess.Popen</code></li> <li>Changed the <code>ResourceWarning</code> from an unclosed memory object stream to include its address for easier identification</li> <li>Changed <code>start_blocking_portal()</code> to always use daemonic threads, to accommodate the "loitering event loop" use case</li> <li>Bumped the minimum version of Trio to v0.26.1</li> <li>Fixed <code>__repr__()</code> of <code>MemoryObjectItemReceiver</code>, when <code>item</code> is not defined (<a href="https://redirect.github.com/agronholm/anyio/pulls/767">#767</a>; PR by <a href="https://github.com/Danipulok"><code>@Danipulok</code></a>)</li> <li>Fixed <code>to_process.run_sync()</code> failing to initialize if <code>__main__.__file__</code> pointed to a file in a nonexistent directory (<a href="https://redirect.github.com/agronholm/anyio/issues/696">#696</a>)</li> <li>Fixed <code>AssertionError: feed_data after feed_eof</code> on asyncio when a subprocess is closed early, before its output has been read (<a href="https://redirect.github.com/agronholm/anyio/issues/490">#490</a>)</li> <li>Fixed <code>TaskInfo.has_pending_cancellation()</code> on asyncio not respecting shielded scopes (<a href="https://redirect.github.com/agronholm/anyio/issues/771">#771</a>; PR by <a href="https://github.com/gschaffner"><code>@gschaffner</code></a>)</li> <li>Fixed <code>SocketStream.receive()</code> returning <code>bytearray</code> instead of <code>bytes</code> when using asyncio with <code>ProactorEventLoop</code> (Windows) (<a href="https://redirect.github.com/agronholm/anyio/issues/776">#776</a>)</li> <li>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)</li> <li>Fixed support for Linux abstract namespaces in UNIX sockets that was broken in v4.2 (<a href="https://redirect.github.com/agronholm/anyio/issues/781">#781</a> <<a href="https://redirect.github.com/agronholm/anyio/issues/781">agronholm/anyio#781</a>>_; PR by <a href="https://github.com/tapetersen"><code>@tapetersen</code></a>)</li> <li>Fixed <code>KeyboardInterrupt</code> (ctrl+c) hanging the asyncio pytest runner</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst">anyio's changelog</a>.</em></p> <blockquote> <h1>Version history</h1> <p>This library adheres to <code>Semantic Versioning 2.0 <http://semver.org/></code>_.</p> <p><strong>4.6.0</strong></p> <ul> <li>Dropped support for Python 3.8 (as <code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_ cannot be resolved without cancel message support)</li> <li>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 (<code>[#695](agronholm/anyio#695) <https://github.com/agronholm/anyio/issues/695></code>_)</li> <li>Fixed cancel scopes on asyncio not propagating <code>CancelledError</code> on exit when the enclosing cancel scope has been effectively cancelled (<code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_)</li> <li>Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on</li> <li>Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running</li> </ul> <p><strong>4.5.0</strong></p> <ul> <li>Improved the performance of <code>anyio.Lock</code> and <code>anyio.Semaphore</code> on asyncio (even up to 50 %)</li> <li>Added the <code>fast_acquire</code> parameter to <code>anyio.Lock</code> and <code>anyio.Semaphore</code> to further boost performance at the expense of safety (<code>acquire()</code> will not yield control back if there is no contention)</li> <li>Added support for the <code>from_uri()</code>, <code>full_match()</code>, <code>parser</code> methods/properties in <code>anyio.Path</code>, newly added in Python 3.13 (<code>[#737](agronholm/anyio#737) <https://github.com/agronholm/anyio/issues/737></code>_)</li> <li>Added support for more keyword arguments for <code>run_process()</code> and <code>open_process()</code>: <code>startupinfo</code>, <code>creationflags</code>, <code>pass_fds</code>, <code>user</code>, <code>group</code>, <code>extra_groups</code> and <code>umask</code> (<code>[#742](agronholm/anyio#742) <https://github.com/agronholm/anyio/issues/742></code>_)</li> <li>Improved the type annotations and support for <code>PathLike</code> in <code>run_process()</code> and <code>open_process()</code> to allow for path-like arguments, just like <code>subprocess.Popen</code></li> <li>Changed the <code>ResourceWarning</code> from an unclosed memory object stream to include its address for easier identification</li> <li>Changed <code>start_blocking_portal()</code> to always use daemonic threads, to accommodate the "loitering event loop" use case</li> <li>Bumped the minimum version of Trio to v0.26.1</li> <li>Fixed <code>__repr__()</code> of <code>MemoryObjectItemReceiver</code>, when <code>item</code> is not defined (<code>[#767](agronholm/anyio#767) <https://github.com/agronholm/anyio/pulls/767></code>_; PR by <a href="https://github.com/Danipulok"><code>@Danipulok</code></a>)</li> <li>Fixed <code>to_process.run_sync()</code> failing to initialize if <code>__main__.__file__</code> pointed to a file in a nonexistent directory (<code>[#696](agronholm/anyio#696) <https://github.com/agronholm/anyio/issues/696></code>_)</li> <li>Fixed <code>AssertionError: feed_data after feed_eof</code> on asyncio when a subprocess is closed early, before its output has been read (<code>[#490](agronholm/anyio#490) <https://github.com/agronholm/anyio/issues/490></code>_)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/anyio/commit/8cce74917ffc7523203ab44862f20fd61f065cc5"><code>8cce749</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/01a37c603d55605e0d6f21b7d43828f4738c7a3d"><code>01a37c6</code></a> Fixed TaskGroup and CancelScope exit issues on asyncio (<a href="https://redirect.github.com/agronholm/anyio/issues/774">#774</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/7f35ce79e3eb9db2a2731619b48fe289d8dd872f"><code>7f35ce7</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/108cc8300aa5a0d5be2834a8bbd3eb1938b8c104"><code>108cc83</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/anyio/issues/788">#788</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/d1aea98c4f552d04458e49f1484b9c018f2a3ca8"><code>d1aea98</code></a> Fixed KeyboardInterrupt hanging the asyncio test runner (<a href="https://redirect.github.com/agronholm/anyio/issues/779">#779</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/c1aff53d8ae5ddc2cf1b8558614a7a2d60c12518"><code>c1aff53</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/anyio/issues/785">#785</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/89d8b4c9609e22306c597cea98ecf3fba45fb663"><code>89d8b4c</code></a> Use sphinx_rtd_theme also as an extension</li> <li><a href="https://github.com/agronholm/anyio/commit/4e9f18dfaa6e7db55231a35fcd93e18c343519a4"><code>4e9f18d</code></a> Enabled uvloop to be used in the test suite on Python 3.13</li> <li><a href="https://github.com/agronholm/anyio/commit/7de644113250a817dd3224e6df9b3658cb09802d"><code>7de6441</code></a> Pin Sphinx to a compatible version with sphinx-rtd-theme</li> <li><a href="https://github.com/agronholm/anyio/commit/41647f4ba7389dc756b0401033af1e3f41ad8a60"><code>41647f4</code></a> Fixed feed_data after feed_eof assertion errors on asyncio (<a href="https://redirect.github.com/agronholm/anyio/issues/752">#752</a>)</li> <li>Additional commits viewable in <a href="https://github.com/agronholm/anyio/compare/4.4.0...4.6.0">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyio&package-manager=pip&previous-version=4.4.0&new-version=4.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [anyio](https://github.com/agronholm/anyio) from 4.5.0 to 4.6.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/releases">anyio's releases</a>.</em></p> <blockquote> <h2>4.6.0</h2> <ul> <li>Dropped support for Python 3.8 (as <a href="https://redirect.github.com/agronholm/anyio/issues/698">#698</a> cannot be resolved without cancel message support)</li> <li>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 (<a href="https://redirect.github.com/agronholm/anyio/issues/695">#695</a>)</li> <li>Fixed cancel scopes on asyncio not propagating <code>CancelledError</code> on exit when the enclosing cancel scope has been effectively cancelled (<a href="https://redirect.github.com/agronholm/anyio/issues/698">#698</a>)</li> <li>Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on</li> <li>Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst">anyio's changelog</a>.</em></p> <blockquote> <h1>Version history</h1> <p>This library adheres to <code>Semantic Versioning 2.0 <http://semver.org/></code>_.</p> <p><strong>4.6.0</strong></p> <ul> <li>Dropped support for Python 3.8 (as <code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_ cannot be resolved without cancel message support)</li> <li>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 (<code>[#695](agronholm/anyio#695) <https://github.com/agronholm/anyio/issues/695></code>_)</li> <li>Fixed cancel scopes on asyncio not propagating <code>CancelledError</code> on exit when the enclosing cancel scope has been effectively cancelled (<code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_)</li> <li>Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on</li> <li>Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running</li> </ul> <p><strong>4.5.0</strong></p> <ul> <li>Improved the performance of <code>anyio.Lock</code> and <code>anyio.Semaphore</code> on asyncio (even up to 50 %)</li> <li>Added the <code>fast_acquire</code> parameter to <code>anyio.Lock</code> and <code>anyio.Semaphore</code> to further boost performance at the expense of safety (<code>acquire()</code> will not yield control back if there is no contention)</li> <li>Added support for the <code>from_uri()</code>, <code>full_match()</code>, <code>parser</code> methods/properties in <code>anyio.Path</code>, newly added in Python 3.13 (<code>[#737](agronholm/anyio#737) <https://github.com/agronholm/anyio/issues/737></code>_)</li> <li>Added support for more keyword arguments for <code>run_process()</code> and <code>open_process()</code>: <code>startupinfo</code>, <code>creationflags</code>, <code>pass_fds</code>, <code>user</code>, <code>group</code>, <code>extra_groups</code> and <code>umask</code> (<code>[#742](agronholm/anyio#742) <https://github.com/agronholm/anyio/issues/742></code>_)</li> <li>Improved the type annotations and support for <code>PathLike</code> in <code>run_process()</code> and <code>open_process()</code> to allow for path-like arguments, just like <code>subprocess.Popen</code></li> <li>Changed the <code>ResourceWarning</code> from an unclosed memory object stream to include its address for easier identification</li> <li>Changed <code>start_blocking_portal()</code> to always use daemonic threads, to accommodate the "loitering event loop" use case</li> <li>Bumped the minimum version of Trio to v0.26.1</li> <li>Fixed <code>__repr__()</code> of <code>MemoryObjectItemReceiver</code>, when <code>item</code> is not defined (<code>[#767](agronholm/anyio#767) <https://github.com/agronholm/anyio/pulls/767></code>_; PR by <a href="https://github.com/Danipulok"><code>@Danipulok</code></a>)</li> <li>Fixed <code>to_process.run_sync()</code> failing to initialize if <code>__main__.__file__</code> pointed to a file in a nonexistent directory (<code>[#696](agronholm/anyio#696) <https://github.com/agronholm/anyio/issues/696></code>_)</li> <li>Fixed <code>AssertionError: feed_data after feed_eof</code> on asyncio when a subprocess is closed early, before its output has been read (<code>[#490](agronholm/anyio#490) <https://github.com/agronholm/anyio/issues/490></code>_)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/anyio/commit/8cce74917ffc7523203ab44862f20fd61f065cc5"><code>8cce749</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/01a37c603d55605e0d6f21b7d43828f4738c7a3d"><code>01a37c6</code></a> Fixed TaskGroup and CancelScope exit issues on asyncio (<a href="https://redirect.github.com/agronholm/anyio/issues/774">#774</a>)</li> <li>See full diff in <a href="https://github.com/agronholm/anyio/compare/4.5.0...4.6.0">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyio&package-manager=pip&previous-version=4.5.0&new-version=4.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [anyio](https://github.com/agronholm/anyio) from 4.6.0 to 4.6.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/releases">anyio's releases</a>.</em></p> <blockquote> <h2>4.6.2</h2> <ul> <li>Fixed regression caused by (<a href="https://redirect.github.com/agronholm/anyio/pull/807">#807</a>) that prevented the use of parametrized async fixtures</li> </ul> <h2>4.6.1</h2> <p>This release contains all the changes from both v4.5.1 and v4.6.0, plus:</p> <ul> <li>Fixed TaskGroup and CancelScope producing cyclic references in tracebacks when raising exceptions (<a href="https://redirect.github.com/agronholm/anyio/pull/806">#806</a>) (PR by <a href="https://github.com/graingert"><code>@graingert</code></a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst">anyio's changelog</a>.</em></p> <blockquote> <h1>Version history</h1> <p>This library adheres to <code>Semantic Versioning 2.0 <http://semver.org/></code>_.</p> <p><strong>4.6.2</strong></p> <ul> <li>Fixed regression caused by (<code>[#807](agronholm/anyio#807) <https://github.com/agronholm/anyio/pull/807></code>_) that prevented the use of parametrized async fixtures</li> </ul> <p><strong>4.6.1</strong></p> <p>This release contains all the changes from both v4.5.1 and v4.6.0, plus:</p> <ul> <li>Fixed TaskGroup and CancelScope producing cyclic references in tracebacks when raising exceptions (<code>[#806](agronholm/anyio#806) <https://github.com/agronholm/anyio/pull/806></code>_) (PR by <a href="https://github.com/graingert"><code>@graingert</code></a>)</li> </ul> <p><strong>4.6.0</strong></p> <p>This release is the successor to v4.5.0 with Python 3.8 support dropped, and does not contain the changes from v4.5.1.</p> <ul> <li>Dropped support for Python 3.8 (as <code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_ cannot be resolved without cancel message support)</li> <li>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 (<code>[#695](agronholm/anyio#695) <https://github.com/agronholm/anyio/issues/695></code>_)</li> <li>Fixed cancel scopes on asyncio not propagating <code>CancelledError</code> on exit when the enclosing cancel scope has been effectively cancelled (<code>[#698](agronholm/anyio#698) <https://github.com/agronholm/anyio/issues/698></code>_)</li> <li>Fixed asyncio task groups not yielding control to the event loop at exit if there were no child tasks to wait on</li> <li>Fixed inconsistent task uncancellation with asyncio cancel scopes belonging to a task group when said task group has child tasks running</li> </ul> <p><strong>4.5.1</strong></p> <p>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.</p> <ul> <li>Fixed acquring a lock twice in the same task on asyncio hanging instead of raising a <code>RuntimeError</code> (<code>[#798](agronholm/anyio#798) <https://github.com/agronholm/anyio/issues/798></code>_)</li> <li>Fixed an async fixture's <code>self</code> being different than the test's <code>self</code> in class-based tests (<code>[#633](agronholm/anyio#633) <https://github.com/agronholm/anyio/issues/633></code>_) (PR by <a href="https://github.com/agronholm"><code>@agronholm</code></a> and <a href="https://github.com/graingert"><code>@graingert</code></a>)</li> <li>Fixed <code>TypeError</code> with <code>TLSStream</code> on Windows when a certificate verification error occurs when using a <code>truststore <https://github.com/sethmlarson/truststore></code>_ SSL certificate (<code>[#795](agronholm/anyio#795) <https://github.com/agronholm/anyio/issues/795></code>_)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/anyio/commit/5861355e2a882e0e33c209fcab287569c8405189"><code>5861355</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/f6ddfc803e2bc2fb79cd0556091b3b98e94a1de1"><code>f6ddfc8</code></a> Fixed a regression in the pytest plugin that broke parametrized async fixtures</li> <li><a href="https://github.com/agronholm/anyio/commit/4ecc96330c0dd8789db964a5569bff7f09ca083b"><code>4ecc963</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/5489fbd47148207fa830e1f33e751f9361c25713"><code>5489fbd</code></a> Fixed tox configuration</li> <li><a href="https://github.com/agronholm/anyio/commit/77b94df83e0c48264ef1ad3ba2fa58a28f292887"><code>77b94df</code></a> Updated Path documentation and made is_junction() conditional (<a href="https://redirect.github.com/agronholm/anyio/issues/800">#800</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/bf130dc793bcb52d65000e714d1e98b8ab243786"><code>bf130dc</code></a> Fixed TypeError when TLS handshake fails with truststore SSLContext (<a href="https://redirect.github.com/agronholm/anyio/issues/801">#801</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/4cb89a525cfaf2f02d0f761dc31185afb7b5fbd1"><code>4cb89a5</code></a> Migrated to native TOML configuration for Tox</li> <li><a href="https://github.com/agronholm/anyio/commit/6bebf18279924f7a5178ef3c9ac926768b9240f9"><code>6bebf18</code></a> Made test_start_task_soon_cancel_immediately() less flaky</li> <li><a href="https://github.com/agronholm/anyio/commit/e8546bd1cdac8922d5d43efd6e0be334488f9244"><code>e8546bd</code></a> Rebind instance method fixtures to the same instance as the test (<a href="https://redirect.github.com/agronholm/anyio/issues/807">#807</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/57bcbc9c5674fd6fc40077c2ad3810f84d9399ae"><code>57bcbc9</code></a> Updated macOS and Windows to test on Python 3.13 by default</li> <li>Additional commits viewable in <a href="https://github.com/agronholm/anyio/compare/4.6.0...4.6.2">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyio&package-manager=pip&previous-version=4.6.0&new-version=4.6.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Things to check first
I have searched the existing issues and didn't find my bug already reported there
I have checked that my bug is still present in the latest release
AnyIO version
4.3.0
Python version
3.9.2, 3.12.1
What happened?
After Ctrl+C the program uses 100% CPU.
Looks like the problem in (since
call_soon
works without problems):anyio/src/anyio/_backends/_asyncio.py
Line 231 in e0529a3
https://github.com/python/cpython/blob/72dbea28cd3fce6fc457aaec2107a8e453073297/Lib/asyncio/base_events.py#L871
How can we reproduce the bug?
Ctrl+C
The text was updated successfully, but these errors were encountered: