From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Tue, 29 May 2018 01:32:17 +0000 (-0700) Subject: bpo-33469: RuntimeError after closing loop that used run_in_executor (GH-7171) X-Git-Tag: v3.6.6rc1~87 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a6d6bd70ac95a0f7bbfe07d4e60b43afcec370d2;p=thirdparty%2FPython%2Fcpython.git bpo-33469: RuntimeError after closing loop that used run_in_executor (GH-7171) (cherry picked from commit fdccfe09f0b10776645fdb04a0783d6864c32b21) Co-authored-by: Yury Selivanov --- diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 9ff143039a32..3a0b57e30eab 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -408,6 +408,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 2c4629ab4924..1ecc89f2e758 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -362,6 +362,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 = test_utils.socketpair() r.setblocking(False) diff --git a/Misc/NEWS.d/next/Library/2018-05-28-15-55-12.bpo-33469.hmXBpY.rst b/Misc/NEWS.d/next/Library/2018-05-28-15-55-12.bpo-33469.hmXBpY.rst new file mode 100644 index 000000000000..cc1b2e436f2a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-28-15-55-12.bpo-33469.hmXBpY.rst @@ -0,0 +1 @@ +Fix RuntimeError after closing loop that used run_in_executor