summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-10-11 01:49:09 (GMT)
committerGitHub <noreply@github.com>2023-10-11 01:49:09 (GMT)
commit1556f426da3f2fb5842689999933c8038b65c034 (patch)
tree18ea8a0fdd1e18f25e6067a1be76567d364ece99
parentf901f56313610389027cb4eae80d1d4b071aef69 (diff)
downloadcpython-1556f426da3f2fb5842689999933c8038b65c034.zip
cpython-1556f426da3f2fb5842689999933c8038b65c034.tar.gz
cpython-1556f426da3f2fb5842689999933c8038b65c034.tar.bz2
gh-110666: Fix multiprocessing test_terminate() elapsed (#110667)
multiprocessing test_terminate() and test_wait_socket_slow() no longer test the CI performance: no longer check maximum elapsed time. Add CLOCK_RES constant: tolerate a difference of 100 ms.
-rw-r--r--Lib/test/_test_multiprocessing.py35
1 files changed, 15 insertions, 20 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 650fbad..26649ed 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -84,6 +84,11 @@ if support.HAVE_ASAN_FORK_BUG:
raise unittest.SkipTest("libasan has a pthread_create() dead lock related to thread+fork")
+# gh-110666: Tolerate a difference of 100 ms when comparing timings
+# (clock resolution)
+CLOCK_RES = 0.100
+
+
def latin(s):
return s.encode('latin')
@@ -1655,8 +1660,7 @@ class _TestCondition(BaseTestCase):
dt = time.monotonic()
result = cond.wait_for(lambda : state.value==4, timeout=expected)
dt = time.monotonic() - dt
- # borrow logic in assertTimeout() from test/lock_tests.py
- if not result and expected * 0.6 <= dt:
+ if not result and (expected - CLOCK_RES) <= dt:
success.value = True
@unittest.skipUnless(HAS_SHAREDCTYPES, 'needs sharedctypes')
@@ -2678,14 +2682,11 @@ class _TestPool(BaseTestCase):
p.join()
def test_terminate(self):
- result = self.pool.map_async(
- time.sleep, [0.1 for i in range(10000)], chunksize=1
- )
+ # Simulate slow tasks which take "forever" to complete
+ args = [support.LONG_TIMEOUT for i in range(10_000)]
+ result = self.pool.map_async(time.sleep, args, chunksize=1)
self.pool.terminate()
- join = TimingWrapper(self.pool.join)
- join()
- # Sanity check the pool didn't wait for all tasks to finish
- self.assertLess(join.elapsed, 2.0)
+ self.pool.join()
def test_empty_iterable(self):
# See Issue 12157
@@ -4908,7 +4909,7 @@ class TestWait(unittest.TestCase):
def _child_test_wait(cls, w, slow):
for i in range(10):
if slow:
- time.sleep(random.random()*0.1)
+ time.sleep(random.random() * 0.100)
w.send((i, os.getpid()))
w.close()
@@ -4948,7 +4949,7 @@ class TestWait(unittest.TestCase):
s.connect(address)
for i in range(10):
if slow:
- time.sleep(random.random()*0.1)
+ time.sleep(random.random() * 0.100)
s.sendall(('%s\n' % i).encode('ascii'))
s.close()
@@ -4997,25 +4998,19 @@ class TestWait(unittest.TestCase):
def test_wait_timeout(self):
from multiprocessing.connection import wait
- expected = 5
+ timeout = 5.0 # seconds
a, b = multiprocessing.Pipe()
start = time.monotonic()
- res = wait([a, b], expected)
+ res = wait([a, b], timeout)
delta = time.monotonic() - start
self.assertEqual(res, [])
- self.assertLess(delta, expected * 2)
- self.assertGreater(delta, expected * 0.5)
+ self.assertGreater(delta, timeout - CLOCK_RES)
b.send(None)
-
- start = time.monotonic()
res = wait([a, b], 20)
- delta = time.monotonic() - start
-
self.assertEqual(res, [a])
- self.assertLess(delta, 0.4)
@classmethod
def signal_and_sleep(cls, sem, period):