Commit 22d25085 authored by Elvis Pranskevichus's avatar Elvis Pranskevichus Committed by Victor Stinner

bpo-34075: Deprecate non-ThreadPoolExecutor in loop.set_default_executor() (GH-8533)

Various asyncio internals expect that the default executor is a
`ThreadPoolExecutor`, so deprecate passing anything else to
`loop.set_default_executor()`.
parent 4e11c461
......@@ -906,7 +906,14 @@ pool of processes). By default, an event loop uses a thread pool executor
.. method:: AbstractEventLoop.set_default_executor(executor)
Set the default executor used by :meth:`run_in_executor`.
Set *executor* as the default executor used by :meth:`run_in_executor`.
*executor* should be an instance of
:class:`~concurrent.futures.ThreadPoolExecutor`.
.. deprecated:: 3.8
Using an executor that is not an instance of
:class:`~concurrent.futures.ThreadPoolExecutor` is deprecated and
will trigger an error in Python 3.9.
Error Handling API
......
......@@ -164,6 +164,12 @@ Deprecated
They will be removed in Python 3.9.
(Contributed by Serhiy Storchaka in :issue:`29209`.)
* Passing an object that is not an instance of
:class:`concurrent.futures.ThreadPoolExecutor` to
:meth:`asyncio.AbstractEventLoop.set_default_executor()` is
deprecated and will be prohibited in Python 3.9.
(Contributed by Elvis Pranskevichus in :issue:`34075`.)
Removed
=======
......
......@@ -741,6 +741,12 @@ class BaseEventLoop(events.AbstractEventLoop):
executor.submit(func, *args), loop=self)
def set_default_executor(self, executor):
if not isinstance(executor, concurrent.futures.ThreadPoolExecutor):
warnings.warn(
'Using the default executor that is not an instance of '
'ThreadPoolExecutor is deprecated and will be prohibited '
'in Python 3.9',
DeprecationWarning, 2)
self._default_executor = executor
def _getaddrinfo_debug(self, host, port, family, type, proto, flags):
......
"""Tests for base_events.py"""
import concurrent.futures
import errno
import logging
import math
......@@ -211,10 +212,21 @@ class BaseEventLoopTests(test_utils.TestCase):
self.assertFalse(self.loop._ready)
def test_set_default_executor(self):
executor = mock.Mock()
class DummyExecutor(concurrent.futures.ThreadPoolExecutor):
def submit(self, fn, *args, **kwargs):
raise NotImplementedError(
'cannot submit into a dummy executor')
executor = DummyExecutor()
self.loop.set_default_executor(executor)
self.assertIs(executor, self.loop._default_executor)
def test_set_default_executor_deprecation_warnings(self):
executor = mock.Mock()
with self.assertWarns(DeprecationWarning):
self.loop.set_default_executor(executor)
def test_call_soon(self):
def cb():
pass
......
Deprecate passing non-ThreadPoolExecutor instances to
:meth:`AbstractEventLoop.set_default_executor`.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment