Commit 1fc3ec91 authored by Victor Stinner's avatar Victor Stinner

Issue #14428: Rewrite test_process_time_threads() test

time.process_time() is CPU time, not a number of seconds.
parent b63fd2a4
...@@ -392,20 +392,53 @@ class TimeTestCase(unittest.TestCase): ...@@ -392,20 +392,53 @@ class TimeTestCase(unittest.TestCase):
@unittest.skipUnless(threading, @unittest.skipUnless(threading,
'need threading') 'need threading')
def test_process_time_threads(self): def test_process_time_threads(self):
class BusyThread(threading.Thread): def factorial(n):
if n >= 2:
return n * factorial(n-1)
else:
return 1
def use_cpu(n, loops):
for loop in range(loops):
factorial(n)
class FactorialThread(threading.Thread):
def __init__(self, n, loops):
threading.Thread.__init__(self)
self.n = n
self.loops = loops
def run(self): def run(self):
while not self.stop: use_cpu(self.n, self.loops)
pass
# Calibrate use_cpu() to use at least 1 ms of system time
n = 50
loops = 1
resolution = time.get_clock_info('process_time').resolution
min_rdt = max(resolution, 0.001)
while 1:
rt1 = time.time()
t1 = time.process_time()
use_cpu(n, loops)
t2 = time.process_time()
rt2 = time.time()
rdt = rt2 - rt1
if rdt >= min_rdt:
break
loops *= 2
busy = t2 - t1
thread = BusyThread() # Ensure that time.process_time() includes the CPU time of all threads
thread.stop = False thread = FactorialThread(n, loops)
t1 = time.process_time() t1 = time.process_time()
thread.start() thread.start()
time.sleep(0.2) # Use sleep() instead of thread.join() because thread.join() time may
# be included in time.process_time() depending on its implementation
time.sleep(rdt * 2)
t2 = time.process_time() t2 = time.process_time()
thread.stop = True thread.stop = True
thread.join() thread.join()
self.assertGreater(t2 - t1, 0.1) self.assertGreaterEqual(t2 - t1, busy)
@unittest.skipUnless(hasattr(time, 'monotonic'), @unittest.skipUnless(hasattr(time, 'monotonic'),
'need time.monotonic') 'need time.monotonic')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment