Skip to content

Commit

Permalink
GH-96827: Don't touch closed loops from executor threads (GH-96837)
Browse files Browse the repository at this point in the history
* When chaining futures, skip callback if loop closed.
* When shutting down an executor, don't wake a closed loop.
(cherry picked from commit e9d6376)

Co-authored-by: Guido van Rossum <guido@python.org>
  • Loading branch information
miss-islington and gvanrossum authored Sep 30, 2022
1 parent 6d7dbcc commit a5c503f
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Lib/asyncio/base_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 2 additions & 0 deletions Lib/asyncio/futures.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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).

0 comments on commit a5c503f

Please sign in to comment.