diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-04-29 17:46:19 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-04-29 17:46:19 (GMT) |
commit | 1fc3ec91cc3e86035179db3e476ae7cd36ca6716 (patch) | |
tree | b20088c03415748c137b212d923ec430300992b5 /Lib | |
parent | b63fd2a4084c99178f5218abc387d6b9bfdf25bc (diff) | |
download | cpython-1fc3ec91cc3e86035179db3e476ae7cd36ca6716.zip cpython-1fc3ec91cc3e86035179db3e476ae7cd36ca6716.tar.gz cpython-1fc3ec91cc3e86035179db3e476ae7cd36ca6716.tar.bz2 |
Issue #14428: Rewrite test_process_time_threads() test
time.process_time() is CPU time, not a number of seconds.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_time.py | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index f00660b..85f8c52 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -392,20 +392,53 @@ class TimeTestCase(unittest.TestCase): @unittest.skipUnless(threading, 'need threading') 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): - while not self.stop: - pass + use_cpu(self.n, self.loops) + + # 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() - thread.stop = False + # Ensure that time.process_time() includes the CPU time of all threads + thread = FactorialThread(n, loops) t1 = time.process_time() 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() thread.stop = True thread.join() - self.assertGreater(t2 - t1, 0.1) + self.assertGreaterEqual(t2 - t1, busy) @unittest.skipUnless(hasattr(time, 'monotonic'), 'need time.monotonic') |