mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
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.
This commit is contained in:
parent
a4d0001256
commit
bec2372b7e
4 changed files with 14 additions and 12 deletions
|
@ -782,6 +782,12 @@ Resolve host name
|
||||||
This method is a :ref:`coroutine <coroutine>`, similar to
|
This method is a :ref:`coroutine <coroutine>`, similar to
|
||||||
:meth:`socket.getnameinfo` function but non-blocking.
|
: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
|
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
|
pool of processes). By default, an event loop uses a thread pool executor
|
||||||
(:class:`~concurrent.futures.ThreadPoolExecutor`).
|
(: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.
|
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*
|
:ref:`Use functools.partial to pass keywords to the *func*
|
||||||
<asyncio-pass-keywords>`.
|
<asyncio-pass-keywords>`.
|
||||||
|
|
||||||
|
This method returns a :class:`asyncio.Future` object.
|
||||||
|
|
||||||
.. versionchanged:: 3.5.3
|
.. versionchanged:: 3.5.3
|
||||||
:meth:`BaseEventLoop.run_in_executor` no longer configures the
|
:meth:`BaseEventLoop.run_in_executor` no longer configures the
|
||||||
``max_workers`` of the thread pool executor it creates, instead
|
``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
|
(:class:`~concurrent.futures.ThreadPoolExecutor`) to set the
|
||||||
default.
|
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)
|
.. method:: AbstractEventLoop.set_default_executor(executor)
|
||||||
|
|
||||||
Set the default executor used by :meth:`run_in_executor`.
|
Set the default executor used by :meth:`run_in_executor`.
|
||||||
|
|
|
@ -721,7 +721,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
||||||
self._write_to_self()
|
self._write_to_self()
|
||||||
return handle
|
return handle
|
||||||
|
|
||||||
async def run_in_executor(self, executor, func, *args):
|
def run_in_executor(self, executor, func, *args):
|
||||||
self._check_closed()
|
self._check_closed()
|
||||||
if self._debug:
|
if self._debug:
|
||||||
self._check_callback(func, 'run_in_executor')
|
self._check_callback(func, 'run_in_executor')
|
||||||
|
@ -730,7 +730,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
||||||
if executor is None:
|
if executor is None:
|
||||||
executor = concurrent.futures.ThreadPoolExecutor()
|
executor = concurrent.futures.ThreadPoolExecutor()
|
||||||
self._default_executor = executor
|
self._default_executor = executor
|
||||||
return await futures.wrap_future(
|
return futures.wrap_future(
|
||||||
executor.submit(func, *args), loop=self)
|
executor.submit(func, *args), loop=self)
|
||||||
|
|
||||||
def set_default_executor(self, executor):
|
def set_default_executor(self, executor):
|
||||||
|
|
|
@ -2999,9 +2999,8 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase):
|
||||||
def task_factory(loop, coro):
|
def task_factory(loop, coro):
|
||||||
raise NameError
|
raise NameError
|
||||||
|
|
||||||
run = self.loop.create_task(
|
run = self.loop.run_in_executor(
|
||||||
self.loop.run_in_executor(
|
None, lambda: self.target(advance_coro=True))
|
||||||
None, lambda: self.target(advance_coro=True)))
|
|
||||||
|
|
||||||
# Set exception handler
|
# Set exception handler
|
||||||
callback = test_utils.MockCallback()
|
callback = test_utils.MockCallback()
|
||||||
|
|
|
@ -426,7 +426,7 @@ Implement asyncio.create_task(coro) shortcut
|
||||||
|
|
||||||
Convert asyncio functions that were documented as coroutines to coroutines.
|
Convert asyncio functions that were documented as coroutines to coroutines.
|
||||||
Affected functions: loop.sock_sendall, loop.sock_recv, loop.sock_accept,
|
Affected functions: loop.sock_sendall, loop.sock_recv, loop.sock_accept,
|
||||||
loop.run_in_executor, loop.getaddrinfo, loop.getnameinfo.
|
loop.getaddrinfo, loop.getnameinfo.
|
||||||
|
|
||||||
..
|
..
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue