Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Lib/asyncio/futures.py
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,9 @@ def _call_check_cancel(destination):
source_loop.call_soon_threadsafe(source.cancel)

def _call_set_state(source):
if (destination.cancelled() and
dest_loop is not None and dest_loop.is_closed()):
return
if dest_loop is None or dest_loop is source_loop:
_set_state(destination, source)
else:
Expand Down
18 changes: 18 additions & 0 deletions Lib/test/test_asyncio/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,24 @@ def run(arg):
self.assertEqual(res, 'yo')
self.assertNotEqual(thread_id, threading.get_ident())

def test_run_in_executor_cancel(self):
called = False

def patched_call_soon(*args):
nonlocal called
called = True

def run():
time.sleep(0.05)

f2 = self.loop.run_in_executor(None, run)
f2.cancel()
self.loop.close()
self.loop.call_soon = patched_call_soon
self.loop.call_soon_threadsafe = patched_call_soon
time.sleep(0.4)
self.assertFalse(called)

def test_reader_callback(self):
r, w = socket.socketpair()
r.setblocking(False)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix RuntimeError after closing loop that used run_in_executor