diff options
author | Yury Selivanov <yury@magic.io> | 2018-01-28 19:09:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-28 19:09:40 (GMT) |
commit | bec2372b7e1da5dfdbadaf242aa8e994b164cace (patch) | |
tree | db2005e235a7e6d82bb49a698eb5b91dd69414c5 | |
parent | a4d00012565d716db6e6abe1b8f33eaaa4de416e (diff) | |
download | cpython-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.rst | 15 | ||||
-rw-r--r-- | Lib/asyncio/base_events.py | 4 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_tasks.py | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/3.7.0a4.rst | 2 |
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. .. |