summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncio/futures.py3
-rw-r--r--Lib/test/test_asyncio/test_events.py18
2 files changed, 21 insertions, 0 deletions
diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py
index 4a56f32..0e0e696 100644
--- a/Lib/asyncio/futures.py
+++ b/Lib/asyncio/futures.py
@@ -353,6 +353,9 @@ def _chain_future(source, 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:
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
index ba28e8c..39d85e8 100644
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -347,6 +347,24 @@ class EventLoopTestsMixin:
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)