[Python-checkins] bpo-33469: RuntimeError after closing loop that used run_in_executor (GH-7171)
Miss Islington (bot)
webhook-mailer at python.org
Mon May 28 21:32:20 EDT 2018
https://github.com/python/cpython/commit/a6d6bd70ac95a0f7bbfe07d4e60b43afcec370d2
commit: a6d6bd70ac95a0f7bbfe07d4e60b43afcec370d2
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-05-28T18:32:17-07:00
summary:
bpo-33469: RuntimeError after closing loop that used run_in_executor (GH-7171)
(cherry picked from commit fdccfe09f0b10776645fdb04a0783d6864c32b21)
Co-authored-by: Yury Selivanov <yury at magic.io>
files:
A Misc/NEWS.d/next/Library/2018-05-28-15-55-12.bpo-33469.hmXBpY.rst
M Lib/asyncio/futures.py
M Lib/test/test_asyncio/test_events.py
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 _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:
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 @@ 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 = 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
More information about the Python-checkins
mailing list