summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_time.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2012-04-29 17:46:19 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2012-04-29 17:46:19 (GMT)
commit1fc3ec91cc3e86035179db3e476ae7cd36ca6716 (patch)
treeb20088c03415748c137b212d923ec430300992b5 /Lib/test/test_time.py
parentb63fd2a4084c99178f5218abc387d6b9bfdf25bc (diff)
downloadcpython-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/test/test_time.py')
-rw-r--r--Lib/test/test_time.py47
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')