mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
GH-94597: deprecate SafeChildWatcher
, FastChildWatcher
and MultiLoopChildWatcher
child watchers (#98089)
This commit is contained in:
parent
75751f4aa5
commit
d8765284f3
7 changed files with 81 additions and 38 deletions
|
@ -22,7 +22,7 @@ import errno
|
|||
import unittest
|
||||
from unittest import mock
|
||||
import weakref
|
||||
|
||||
import warnings
|
||||
if sys.platform not in ('win32', 'vxworks'):
|
||||
import tty
|
||||
|
||||
|
@ -2055,7 +2055,9 @@ else:
|
|||
class UnixEventLoopTestsMixin(EventLoopTestsMixin):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter('ignore', DeprecationWarning)
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
watcher.attach_loop(self.loop)
|
||||
asyncio.set_child_watcher(watcher)
|
||||
|
||||
|
@ -2652,7 +2654,9 @@ class GetEventLoopTestsMixin:
|
|||
asyncio.set_event_loop(self.loop)
|
||||
|
||||
if sys.platform != 'win32':
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter('ignore', DeprecationWarning)
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
watcher.attach_loop(self.loop)
|
||||
asyncio.set_child_watcher(watcher)
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import sys
|
|||
import threading
|
||||
import unittest
|
||||
from unittest import mock
|
||||
import warnings
|
||||
from test.support import socket_helper
|
||||
try:
|
||||
import ssl
|
||||
|
@ -791,8 +792,9 @@ os.close(fd)
|
|||
protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop)
|
||||
transport, _ = self.loop.run_until_complete(
|
||||
self.loop.connect_read_pipe(lambda: protocol, pipe))
|
||||
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter('ignore', DeprecationWarning)
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
watcher.attach_loop(self.loop)
|
||||
try:
|
||||
asyncio.set_child_watcher(watcher)
|
||||
|
|
|
@ -4,7 +4,6 @@ import signal
|
|||
import sys
|
||||
import unittest
|
||||
import warnings
|
||||
import functools
|
||||
from unittest import mock
|
||||
|
||||
import asyncio
|
||||
|
@ -31,19 +30,6 @@ PROGRAM_CAT = [
|
|||
'sys.stdout.buffer.write(data)'))]
|
||||
|
||||
|
||||
@functools.cache
|
||||
def _has_pidfd_support():
|
||||
if not hasattr(os, 'pidfd_open'):
|
||||
return False
|
||||
|
||||
try:
|
||||
os.close(os.pidfd_open(os.getpid()))
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def tearDownModule():
|
||||
asyncio.set_event_loop_policy(None)
|
||||
|
||||
|
@ -688,7 +674,7 @@ if sys.platform != 'win32':
|
|||
self.loop = policy.new_event_loop()
|
||||
self.set_event_loop(self.loop)
|
||||
|
||||
watcher = self.Watcher()
|
||||
watcher = self._get_watcher()
|
||||
watcher.attach_loop(self.loop)
|
||||
policy.set_child_watcher(watcher)
|
||||
|
||||
|
@ -703,32 +689,38 @@ if sys.platform != 'win32':
|
|||
class SubprocessThreadedWatcherTests(SubprocessWatcherMixin,
|
||||
test_utils.TestCase):
|
||||
|
||||
Watcher = unix_events.ThreadedChildWatcher
|
||||
|
||||
@unittest.skip("bpo-38323: MultiLoopChildWatcher has a race condition \
|
||||
and these tests can hang the test suite")
|
||||
class SubprocessMultiLoopWatcherTests(SubprocessWatcherMixin,
|
||||
test_utils.TestCase):
|
||||
|
||||
Watcher = unix_events.MultiLoopChildWatcher
|
||||
def _get_watcher(self):
|
||||
return unix_events.ThreadedChildWatcher()
|
||||
|
||||
class SubprocessSafeWatcherTests(SubprocessWatcherMixin,
|
||||
test_utils.TestCase):
|
||||
|
||||
Watcher = unix_events.SafeChildWatcher
|
||||
def _get_watcher(self):
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
return unix_events.SafeChildWatcher()
|
||||
|
||||
class MultiLoopChildWatcherTests(test_utils.TestCase):
|
||||
|
||||
def test_warns(self):
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
unix_events.MultiLoopChildWatcher()
|
||||
|
||||
class SubprocessFastWatcherTests(SubprocessWatcherMixin,
|
||||
test_utils.TestCase):
|
||||
|
||||
Watcher = unix_events.FastChildWatcher
|
||||
def _get_watcher(self):
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
return unix_events.FastChildWatcher()
|
||||
|
||||
@unittest.skipUnless(
|
||||
_has_pidfd_support(),
|
||||
unix_events.can_use_pidfd(),
|
||||
"operating system does not support pidfds",
|
||||
)
|
||||
class SubprocessPidfdWatcherTests(SubprocessWatcherMixin,
|
||||
test_utils.TestCase):
|
||||
Watcher = unix_events.PidfdChildWatcher
|
||||
|
||||
def _get_watcher(self):
|
||||
return unix_events.PidfdChildWatcher()
|
||||
|
||||
|
||||
class GenericWatcherTests(test_utils.TestCase):
|
||||
|
@ -758,7 +750,7 @@ if sys.platform != 'win32':
|
|||
|
||||
|
||||
@unittest.skipUnless(
|
||||
_has_pidfd_support(),
|
||||
unix_events.can_use_pidfd(),
|
||||
"operating system does not support pidfds",
|
||||
)
|
||||
def test_create_subprocess_with_pidfd(self):
|
||||
|
|
|
@ -12,6 +12,7 @@ import sys
|
|||
import threading
|
||||
import unittest
|
||||
from unittest import mock
|
||||
import warnings
|
||||
from test.support import os_helper
|
||||
from test.support import socket_helper
|
||||
|
||||
|
@ -1686,12 +1687,16 @@ class ChildWatcherTestsMixin:
|
|||
|
||||
class SafeChildWatcherTests (ChildWatcherTestsMixin, test_utils.TestCase):
|
||||
def create_watcher(self):
|
||||
return asyncio.SafeChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
return asyncio.SafeChildWatcher()
|
||||
|
||||
|
||||
class FastChildWatcherTests (ChildWatcherTestsMixin, test_utils.TestCase):
|
||||
def create_watcher(self):
|
||||
return asyncio.FastChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
return asyncio.FastChildWatcher()
|
||||
|
||||
|
||||
class PolicyTests(unittest.TestCase):
|
||||
|
@ -1724,7 +1729,9 @@ class PolicyTests(unittest.TestCase):
|
|||
|
||||
def test_get_child_watcher_after_set(self):
|
||||
policy = self.create_policy()
|
||||
watcher = asyncio.FastChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
watcher = asyncio.FastChildWatcher()
|
||||
|
||||
policy.set_child_watcher(watcher)
|
||||
self.assertIs(policy._watcher, watcher)
|
||||
|
@ -1745,7 +1752,9 @@ class PolicyTests(unittest.TestCase):
|
|||
policy.get_event_loop().close()
|
||||
|
||||
policy = self.create_policy()
|
||||
policy.set_child_watcher(asyncio.SafeChildWatcher())
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
policy.set_child_watcher(asyncio.SafeChildWatcher())
|
||||
|
||||
th = threading.Thread(target=f)
|
||||
th.start()
|
||||
|
@ -1757,7 +1766,9 @@ class PolicyTests(unittest.TestCase):
|
|||
|
||||
# Explicitly setup SafeChildWatcher,
|
||||
# default ThreadedChildWatcher has no _loop property
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
watcher = asyncio.SafeChildWatcher()
|
||||
policy.set_child_watcher(watcher)
|
||||
watcher.attach_loop(loop)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue