summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYury Selivanov <yury@magic.io>2018-01-28 19:09:40 (GMT)
committerGitHub <noreply@github.com>2018-01-28 19:09:40 (GMT)
commitbec2372b7e1da5dfdbadaf242aa8e994b164cace (patch)
treedb2005e235a7e6d82bb49a698eb5b91dd69414c5
parenta4d00012565d716db6e6abe1b8f33eaaa4de416e (diff)
downloadcpython-bec2372b7e1da5dfdbadaf242aa8e994b164cace.zip
cpython-bec2372b7e1da5dfdbadaf242aa8e994b164cace.tar.gz
cpython-bec2372b7e1da5dfdbadaf242aa8e994b164cace.tar.bz2
bpo-32327: Revert loop.run_in_executor behaviour: return a Future. (#5392)
I've run some tests on 3.7 asyncio and it appears that too many things assume that run_in_executor returns a Future.
-rw-r--r--Doc/library/asyncio-eventloop.rst15
-rw-r--r--Lib/asyncio/base_events.py4
-rw-r--r--Lib/test/test_asyncio/test_tasks.py5
-rw-r--r--Misc/NEWS.d/3.7.0a4.rst2
4 files changed, 14 insertions, 12 deletions
diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst
index 78ae183..5f915c5 100644
--- a/Doc/library/asyncio-eventloop.rst
+++ b/Doc/library/asyncio-eventloop.rst
@@ -782,6 +782,12 @@ Resolve host name
This method is a :ref:`coroutine <coroutine>`, similar to
:meth:`socket.getnameinfo` function but non-blocking.
+.. versionchanged:: 3.7
+ Both *getaddrinfo* and *getnameinfo* methods were always documented
+ to return a coroutine, but prior to Python 3.7 they were, in fact,
+ returning :class:`asyncio.Future` objects. Starting with Python 3.7
+ both methods are coroutines.
+
Connect pipes
-------------
@@ -852,7 +858,7 @@ Call a function in an :class:`~concurrent.futures.Executor` (pool of threads or
pool of processes). By default, an event loop uses a thread pool executor
(:class:`~concurrent.futures.ThreadPoolExecutor`).
-.. coroutinemethod:: AbstractEventLoop.run_in_executor(executor, func, \*args)
+.. method:: AbstractEventLoop.run_in_executor(executor, func, \*args)
Arrange for a *func* to be called in the specified executor.
@@ -862,6 +868,8 @@ pool of processes). By default, an event loop uses a thread pool executor
:ref:`Use functools.partial to pass keywords to the *func*
<asyncio-pass-keywords>`.
+ This method returns a :class:`asyncio.Future` object.
+
.. versionchanged:: 3.5.3
:meth:`BaseEventLoop.run_in_executor` no longer configures the
``max_workers`` of the thread pool executor it creates, instead
@@ -869,11 +877,6 @@ pool of processes). By default, an event loop uses a thread pool executor
(:class:`~concurrent.futures.ThreadPoolExecutor`) to set the
default.
- .. versionchanged:: 3.7
- Even though the method was always documented as a coroutine
- method, before Python 3.7 it returned a :class:`Future`.
- Since Python 3.7, this is an ``async def`` method.
-
.. method:: AbstractEventLoop.set_default_executor(executor)
Set the default executor used by :meth:`run_in_executor`.
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index 7442bf2..09eb440 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -721,7 +721,7 @@ class BaseEventLoop(events.AbstractEventLoop):
self._write_to_self()
return handle
- async def run_in_executor(self, executor, func, *args):
+ def run_in_executor(self, executor, func, *args):
self._check_closed()
if self._debug:
self._check_callback(func, 'run_in_executor')
@@ -730,7 +730,7 @@ class BaseEventLoop(events.AbstractEventLoop):
if executor is None:
executor = concurrent.futures.ThreadPoolExecutor()
self._default_executor = executor
- return await futures.wrap_future(
+ return futures.wrap_future(
executor.submit(func, *args), loop=self)
def set_default_executor(self, executor):
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 822338f..19cf1e6 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -2999,9 +2999,8 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase):
def task_factory(loop, coro):
raise NameError
- run = self.loop.create_task(
- self.loop.run_in_executor(
- None, lambda: self.target(advance_coro=True)))
+ run = self.loop.run_in_executor(
+ None, lambda: self.target(advance_coro=True))
# Set exception handler
callback = test_utils.MockCallback()
diff --git a/Misc/NEWS.d/3.7.0a4.rst b/Misc/NEWS.d/3.7.0a4.rst
index a6322ed..5c3da97 100644
--- a/Misc/NEWS.d/3.7.0a4.rst
+++ b/Misc/NEWS.d/3.7.0a4.rst
@@ -426,7 +426,7 @@ Implement asyncio.create_task(coro) shortcut
Convert asyncio functions that were documented as coroutines to coroutines.
Affected functions: loop.sock_sendall, loop.sock_recv, loop.sock_accept,
-loop.run_in_executor, loop.getaddrinfo, loop.getnameinfo.
+loop.getaddrinfo, loop.getnameinfo.
..