Skip to content

Commit

Permalink
GH-94597: add deprecation warnings for subclassing `AbstractChildWatc…
Browse files Browse the repository at this point in the history
…her` (#99386)
  • Loading branch information
kumaraditya303 authored Nov 12, 2022
1 parent e02cc6d commit aa87432
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 3 deletions.
3 changes: 3 additions & 0 deletions Doc/library/asyncio-policy.rst
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,9 @@ implementation used by the asyncio event loop:
This method has to be called to ensure that underlying
resources are cleaned-up.

.. deprecated:: 3.12


.. class:: ThreadedChildWatcher

This implementation starts a new waiting thread for every subprocess spawn.
Expand Down
4 changes: 2 additions & 2 deletions Doc/whatsnew/3.12.rst
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ asyncio
(Contributed by Kumar Aditya in :gh:`98024`.)

* The child watcher classes :class:`~asyncio.MultiLoopChildWatcher`,
:class:`~asyncio.FastChildWatcher` and
:class:`~asyncio.SafeChildWatcher` are deprecated and
:class:`~asyncio.FastChildWatcher`, :class:`~asyncio.AbstractChildWatcher`
and :class:`~asyncio.SafeChildWatcher` are deprecated and
will be removed in Python 3.14. It is recommended to not manually
configure a child watcher as the event loop now uses the best available
child watcher for each platform (:class:`~asyncio.PidfdChildWatcher`
Expand Down
7 changes: 7 additions & 0 deletions Lib/asyncio/unix_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,13 @@ class AbstractChildWatcher:
waitpid(-1), there should be only one active object per process.
"""

def __init_subclass__(cls) -> None:
if cls.__module__ != __name__:
warnings._deprecated("AbstractChildWatcher",
"{name!r} is deprecated as of Python 3.12 and will be "
"removed in Python {remove}.",
remove=(3, 14))

def add_child_handler(self, pid, callback, *args):
"""Register a new child handler.
Expand Down
9 changes: 8 additions & 1 deletion Lib/test/test_asyncio/test_unix_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -1108,6 +1108,11 @@ def test_write_eof_pending(self):

class AbstractChildWatcherTests(unittest.TestCase):

def test_warns_on_subclassing(self):
with self.assertWarns(DeprecationWarning):
class MyWatcher(asyncio.AbstractChildWatcher):
pass

def test_not_implemented(self):
f = mock.Mock()
watcher = asyncio.AbstractChildWatcher()
Expand Down Expand Up @@ -1747,7 +1752,9 @@ def f():

self.assertIsInstance(policy.get_event_loop(),
asyncio.AbstractEventLoop)
watcher = policy.get_child_watcher()
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
watcher = policy.get_child_watcher()

self.assertIsInstance(watcher, asyncio.SafeChildWatcher)
self.assertIsNone(watcher._loop)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Deprecate :class:`asyncio.AbstractChildWatcher` to be removed in Python 3.14. Patch by Kumar Aditya.

0 comments on commit aa87432

Please sign in to comment.