]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-124402: Speed up test_free_threading and test_super (#124491)
authorVictor Stinner <vstinner@python.org>
Thu, 26 Sep 2024 08:53:17 +0000 (10:53 +0200)
committerGitHub <noreply@github.com>
Thu, 26 Sep 2024 08:53:17 +0000 (10:53 +0200)
* Reduce the number of iterations and the number of threads so a
  whole test file takes less than a minute.
* Refactor test_racing_iter_extend() to remove two levels of
  indentation.
* test_monitoring() uses a sleep of 100 ms instead of 1 second.

Lib/test/test_free_threading/test_list.py
Lib/test/test_free_threading/test_monitoring.py
Lib/test/test_free_threading/test_type.py
Lib/test/test_super.py

index c6b58fcd86f449cfbcc2d6bf34dc6c26867e578e..a705161369e8dd99233a166a57597c2f7bfafd0d 100644 (file)
@@ -3,10 +3,13 @@ import unittest
 from threading import Thread
 from unittest import TestCase
 
-from test import support
 from test.support import threading_helper
 
 
+NTHREAD = 10
+OBJECT_COUNT = 5_000
+
+
 class C:
     def __init__(self, v):
         self.v = v
@@ -14,11 +17,8 @@ class C:
 
 @threading_helper.requires_working_threading()
 class TestList(TestCase):
-    @support.requires_resource('cpu')
     def test_racing_iter_append(self):
-
         l = []
-        OBJECT_COUNT = 10000
 
         def writer_func():
             for i in range(OBJECT_COUNT):
@@ -34,7 +34,7 @@ class TestList(TestCase):
 
         writer = Thread(target=writer_func)
         readers = []
-        for x in range(30):
+        for x in range(NTHREAD):
             reader = Thread(target=reader_func)
             readers.append(reader)
             reader.start()
@@ -44,39 +44,32 @@ class TestList(TestCase):
         for reader in readers:
             reader.join()
 
-    @support.requires_resource('cpu')
     def test_racing_iter_extend(self):
-        iters = [
-            lambda x: [x],
-        ]
-        for iter_case in iters:
-            with self.subTest(iter=iter_case):
-                l = []
-                OBJECT_COUNT = 10000
-
-                def writer_func():
-                    for i in range(OBJECT_COUNT):
-                        l.extend(iter_case(C(i + OBJECT_COUNT)))
-
-                def reader_func():
-                    while True:
-                        count = len(l)
-                        for i, x in enumerate(l):
-                            self.assertEqual(x.v, i + OBJECT_COUNT)
-                        if count == OBJECT_COUNT:
-                            break
-
-                writer = Thread(target=writer_func)
-                readers = []
-                for x in range(30):
-                    reader = Thread(target=reader_func)
-                    readers.append(reader)
-                    reader.start()
-
-                writer.start()
-                writer.join()
-                for reader in readers:
-                    reader.join()
+        l = []
+
+        def writer_func():
+            for i in range(OBJECT_COUNT):
+                l.extend([C(i + OBJECT_COUNT)])
+
+        def reader_func():
+            while True:
+                count = len(l)
+                for i, x in enumerate(l):
+                    self.assertEqual(x.v, i + OBJECT_COUNT)
+                if count == OBJECT_COUNT:
+                    break
+
+        writer = Thread(target=writer_func)
+        readers = []
+        for x in range(NTHREAD):
+            reader = Thread(target=reader_func)
+            readers.append(reader)
+            reader.start()
+
+        writer.start()
+        writer.join()
+        for reader in readers:
+            reader.join()
 
 
 if __name__ == "__main__":
index be582455d118ac889cf250933f9dbb5c00163941..8fec01715531cbe133d40badb923be2fd97a9a82 100644 (file)
@@ -7,7 +7,6 @@ import unittest
 import weakref
 
 from sys import monitoring
-from test import support
 from test.support import threading_helper
 from threading import Thread, _PyRLock
 from unittest import TestCase
@@ -15,7 +14,7 @@ from unittest import TestCase
 
 class InstrumentationMultiThreadedMixin:
     thread_count = 10
-    func_count = 200
+    func_count = 50
     fib = 12
 
     def after_threads(self):
@@ -37,14 +36,13 @@ class InstrumentationMultiThreadedMixin:
     def start_work(self, n, funcs):
         # With the GIL builds we need to make sure that the hooks have
         # a chance to run as it's possible to run w/o releasing the GIL.
-        time.sleep(1)
+        time.sleep(0.1)
         self.work(n, funcs)
 
     def after_test(self):
         """Runs once after the test is done"""
         pass
 
-    @support.requires_resource('cpu')
     def test_instrumentation(self):
         # Setup a bunch of functions which will need instrumentation...
         funcs = []
@@ -220,29 +218,31 @@ class MonitoringMisc(MonitoringTestMixin, TestCase):
         for ref in self.refs:
             self.assertEqual(ref(), None)
 
-    @support.requires_resource('cpu')
     def test_set_local_trace_opcodes(self):
         def trace(frame, event, arg):
             frame.f_trace_opcodes = True
             return trace
 
+        loops = 1_000
+
         sys.settrace(trace)
         try:
             l = _PyRLock()
 
             def f():
-                for i in range(3000):
+                for i in range(loops):
                     with l:
                         pass
 
             t = Thread(target=f)
             t.start()
-            for i in range(3000):
+            for i in range(loops):
                 with l:
                     pass
             t.join()
         finally:
             sys.settrace(None)
 
+
 if __name__ == "__main__":
     unittest.main()
index 977bfd2c7fd2f7889b977ed7f3a8050823d6d2ee..51463b6bb8c1b413f45d7150c19986356b0e64af 100644 (file)
@@ -5,7 +5,6 @@ from concurrent.futures import ThreadPoolExecutor
 from threading import Thread
 from unittest import TestCase
 
-from test import support
 from test.support import threading_helper
 
 
@@ -97,8 +96,9 @@ class TestType(TestCase):
 
         self.run_one(writer_func, reader_func)
 
-    @support.requires_resource('cpu')
     def test___class___modification(self):
+        loops = 200
+
         class Foo:
             pass
 
@@ -108,7 +108,7 @@ class TestType(TestCase):
         thing = Foo()
         def work():
             foo = thing
-            for _ in range(5000):
+            for _ in range(loops):
                 foo.__class__ = Bar
                 type(foo)
                 foo.__class__ = Foo
index b0d1f12513d4044411af68dcf95ae44c1495bc8c..1222ec6a3c410972093840c2e4f895c5e58b5c57 100644 (file)
@@ -4,7 +4,6 @@ import textwrap
 import threading
 import unittest
 from unittest.mock import patch
-from test import support
 from test.support import import_helper, threading_helper
 
 
@@ -515,10 +514,6 @@ class TestSuper(unittest.TestCase):
         an audit hook.
         """
 
-        if support.Py_GIL_DISABLED:
-            # gh-124402: On a Free Threaded build, the test takes a few minutes
-            support.requires('cpu')
-
         class Foo:
             pass
 
@@ -528,7 +523,7 @@ class TestSuper(unittest.TestCase):
         thing = Foo()
         def work():
             foo = thing
-            for _ in range(5000):
+            for _ in range(200):
                 foo.__class__ = Bar
                 type(foo)
                 foo.__class__ = Foo