aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/_test_multiprocessing.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-06-15 11:42:10 +0200
committerGitHub <noreply@github.com>2022-06-15 11:42:10 +0200
commit7e9eaad864349d2cfd4c9ffc4453aba03b2cbc16 (patch)
tree7bc4498a4c5ad027208a714ff9281d2f4639e301 /Lib/test/_test_multiprocessing.py
parent4e9fa71d7e8e2f322f0b81b315ddc921f57384c0 (diff)
downloadcpython-7e9eaad864349d2cfd4c9ffc4453aba03b2cbc16.tar.gz
cpython-7e9eaad864349d2cfd4c9ffc4453aba03b2cbc16.zip
Add test.support.busy_retry() (#93770)
Add busy_retry() and sleeping_retry() functions to test.support.
Diffstat (limited to 'Lib/test/_test_multiprocessing.py')
-rw-r--r--Lib/test/_test_multiprocessing.py60
1 files changed, 25 insertions, 35 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 4a588d96deb..dca5a19d2ed 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -4313,18 +4313,13 @@ class _TestSharedMemory(BaseTestCase):
p.terminate()
p.wait()
- deadline = time.monotonic() + support.LONG_TIMEOUT
- t = 0.1
- while time.monotonic() < deadline:
- time.sleep(t)
- t = min(t*2, 5)
+ err_msg = ("A SharedMemory segment was leaked after "
+ "a process was abruptly terminated")
+ for _ in support.sleeping_retry(support.LONG_TIMEOUT, err_msg):
try:
smm = shared_memory.SharedMemory(name, create=False)
except FileNotFoundError:
break
- else:
- raise AssertionError("A SharedMemory segment was leaked after"
- " a process was abruptly terminated.")
if os.name == 'posix':
# Without this line it was raising warnings like:
@@ -5334,9 +5329,10 @@ class TestResourceTracker(unittest.TestCase):
p.terminate()
p.wait()
- deadline = time.monotonic() + support.LONG_TIMEOUT
- while time.monotonic() < deadline:
- time.sleep(.5)
+ err_msg = (f"A {rtype} resource was leaked after a process was "
+ f"abruptly terminated")
+ for _ in support.sleeping_retry(support.SHORT_TIMEOUT,
+ err_msg):
try:
_resource_unlink(name2, rtype)
except OSError as e:
@@ -5344,10 +5340,7 @@ class TestResourceTracker(unittest.TestCase):
# EINVAL
self.assertIn(e.errno, (errno.ENOENT, errno.EINVAL))
break
- else:
- raise AssertionError(
- f"A {rtype} resource was leaked after a process was "
- f"abruptly terminated.")
+
err = p.stderr.read().decode('utf-8')
p.stderr.close()
expected = ('resource_tracker: There appear to be 2 leaked {} '
@@ -5575,18 +5568,17 @@ class TestSyncManagerTypes(unittest.TestCase):
# but this can take a bit on slow machines, so wait a few seconds
# if there are other children too (see #17395).
join_process(self.proc)
+
start_time = time.monotonic()
- t = 0.01
- while len(multiprocessing.active_children()) > 1:
- time.sleep(t)
- t *= 2
- dt = time.monotonic() - start_time
- if dt >= 5.0:
- test.support.environment_altered = True
- support.print_warning(f"multiprocessing.Manager still has "
- f"{multiprocessing.active_children()} "
- f"active children after {dt} seconds")
+ for _ in support.sleeping_retry(5.0, error=False):
+ if len(multiprocessing.active_children()) <= 1:
break
+ else:
+ dt = time.monotonic() - start_time
+ support.environment_altered = True
+ support.print_warning(f"multiprocessing.Manager still has "
+ f"{multiprocessing.active_children()} "
+ f"active children after {dt:.1f} seconds")
def run_worker(self, worker, obj):
self.proc = multiprocessing.Process(target=worker, args=(obj, ))
@@ -5884,17 +5876,15 @@ class ManagerMixin(BaseMixin):
# but this can take a bit on slow machines, so wait a few seconds
# if there are other children too (see #17395)
start_time = time.monotonic()
- t = 0.01
- while len(multiprocessing.active_children()) > 1:
- time.sleep(t)
- t *= 2
- dt = time.monotonic() - start_time
- if dt >= 5.0:
- test.support.environment_altered = True
- support.print_warning(f"multiprocessing.Manager still has "
- f"{multiprocessing.active_children()} "
- f"active children after {dt} seconds")
+ for _ in support.sleeping_retry(5.0, error=False):
+ if len(multiprocessing.active_children()) <= 1:
break
+ else:
+ dt = time.monotonic() - start_time
+ support.environment_altered = True
+ support.print_warning(f"multiprocessing.Manager still has "
+ f"{multiprocessing.active_children()} "
+ f"active children after {dt:.1f} seconds")
gc.collect() # do garbage collection
if cls.manager._number_of_objects() != 0: