Skip to content

Commit

Permalink
bpo-43234: Prohibit non-ThreadPoolExecutor in loop.set_default_execut…
Browse files Browse the repository at this point in the history
…or (GH-24540)
  • Loading branch information
illia-v committed Jul 1, 2021
1 parent a1092f6 commit ddd5f36
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 17 deletions.
12 changes: 4 additions & 8 deletions Doc/library/asyncio-eventloop.rst
Expand Up @@ -1132,16 +1132,12 @@ Executing code in thread or process pools
.. method:: loop.set_default_executor(executor)

Set *executor* as the default executor used by :meth:`run_in_executor`.
*executor* should be an instance of
*executor* must 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.

*executor* must be an instance of
:class:`concurrent.futures.ThreadPoolExecutor`.
.. versionchanged:: 3.11
*executor* must be an instance of
:class:`~concurrent.futures.ThreadPoolExecutor`.


Error Handling API
Expand Down
9 changes: 9 additions & 0 deletions Doc/whatsnew/3.11.rst
Expand Up @@ -188,6 +188,15 @@ This section lists previously described changes and other bugfixes
that may require changes to your code.


Changes in the Python API
-------------------------

* Prohibited passing non-:class:`concurrent.futures.ThreadPoolExecutor`
executors to :meth:`loop.set_default_executor` following a deprecation in
Python 3.8.
(Contributed by Illia Volochii in :issue:`43234`.)


C API Changes
=============

Expand Down
6 changes: 1 addition & 5 deletions Lib/asyncio/base_events.py
Expand Up @@ -814,11 +814,7 @@ def run_in_executor(self, executor, func, *args):

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)
raise TypeError('executor must be ThreadPoolExecutor instance')
self._default_executor = executor

def _getaddrinfo_debug(self, host, port, family, type, proto, flags):
Expand Down
8 changes: 4 additions & 4 deletions Lib/test/test_asyncio/test_base_events.py
Expand Up @@ -224,14 +224,14 @@ def submit(self, fn, *args, **kwargs):
self.loop.set_default_executor(executor)
self.assertIs(executor, self.loop._default_executor)

def test_set_default_executor_deprecation_warnings(self):
def test_set_default_executor_error(self):
executor = mock.Mock()

with self.assertWarns(DeprecationWarning):
msg = 'executor must be ThreadPoolExecutor instance'
with self.assertRaisesRegex(TypeError, msg):
self.loop.set_default_executor(executor)

# Avoid cleaning up the executor mock
self.loop._default_executor = None
self.assertIsNone(self.loop._default_executor)

def test_call_soon(self):
def cb():
Expand Down
@@ -0,0 +1,3 @@
Prohibit passing non-:class:`concurrent.futures.ThreadPoolExecutor`
executors to :meth:`loop.set_default_executor` following a deprecation in
Python 3.8. Patch by Illia Volochii.

0 comments on commit ddd5f36

Please sign in to comment.