[Python-checkins] GH-96827: Don't touch closed loops from executor threads (GH-96837)

miss-islington webhook-mailer at python.org
Fri Sep 30 16:25:12 EDT 2022


https://github.com/python/cpython/commit/a5c503f296a104d8b5b2e917a2f1ef71be888e1b
commit: a5c503f296a104d8b5b2e917a2f1ef71be888e1b
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-09-30T13:25:06-07:00
summary:

GH-96827: Don't touch closed loops from executor threads (GH-96837)


* When chaining futures, skip callback if loop closed.
* When shutting down an executor, don't wake a closed loop.
(cherry picked from commit e9d63760fea8748638f6e495b5b07bd1805c9591)

Co-authored-by: Guido van Rossum <guido at python.org>

files:
A Misc/NEWS.d/next/Library/2022-09-30-15-56-20.gh-issue-96827.lzy1iw.rst
M Lib/asyncio/base_events.py
M Lib/asyncio/futures.py

diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index ea10399b9413..1cc26ee7ccf0 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -573,9 +573,11 @@ async def shutdown_default_executor(self):
     def _do_shutdown(self, future):
         try:
             self._default_executor.shutdown(wait=True)
-            self.call_soon_threadsafe(future.set_result, None)
+            if not self.is_closed():
+                self.call_soon_threadsafe(future.set_result, None)
         except Exception as ex:
-            self.call_soon_threadsafe(future.set_exception, ex)
+            if not self.is_closed():
+                self.call_soon_threadsafe(future.set_exception, ex)
 
     def _check_running(self):
         if self.is_running():
diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py
index 48a32f868385..5d00ab4c8d31 100644
--- a/Lib/asyncio/futures.py
+++ b/Lib/asyncio/futures.py
@@ -396,6 +396,8 @@ def _call_set_state(source):
         if dest_loop is None or dest_loop is source_loop:
             _set_state(destination, source)
         else:
+            if dest_loop.is_closed():
+                return
             dest_loop.call_soon_threadsafe(_set_state, destination, source)
 
     destination.add_done_callback(_call_check_cancel)
diff --git a/Misc/NEWS.d/next/Library/2022-09-30-15-56-20.gh-issue-96827.lzy1iw.rst b/Misc/NEWS.d/next/Library/2022-09-30-15-56-20.gh-issue-96827.lzy1iw.rst
new file mode 100644
index 000000000000..159ab32ffbfc
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-09-30-15-56-20.gh-issue-96827.lzy1iw.rst
@@ -0,0 +1 @@
+Avoid spurious tracebacks from :mod:`asyncio` when default executor cleanup is delayed until after the event loop is closed (e.g. as the result of a keyboard interrupt).



More information about the Python-checkins mailing list