aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_free_threading/test_enumerate.py
diff options
context:
space:
mode:
authorPieter Eendebak <pieter.eendebak@gmail.com>2025-03-13 19:44:05 +0100
committerGitHub <noreply@github.com>2025-03-14 00:14:05 +0530
commitec46a55d63eaf015c2cd544b8c727ed7cbb81d33 (patch)
treeb488e230530b1e3d78d6217ac6d1df307ee64697 /Lib/test/test_free_threading/test_enumerate.py
parent7ea6e88eb490635518c63c3305c03baf3e151555 (diff)
downloadcpython-ec46a55d63eaf015c2cd544b8c727ed7cbb81d33.tar.gz
cpython-ec46a55d63eaf015c2cd544b8c727ed7cbb81d33.zip
gh-121464: Make concurrent iteration over enumerate safe under free-threading (#125734)
Diffstat (limited to 'Lib/test/test_free_threading/test_enumerate.py')
-rw-r--r--Lib/test/test_free_threading/test_enumerate.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/Lib/test/test_free_threading/test_enumerate.py b/Lib/test/test_free_threading/test_enumerate.py
new file mode 100644
index 00000000000..d23f5e9529f
--- /dev/null
+++ b/Lib/test/test_free_threading/test_enumerate.py
@@ -0,0 +1,38 @@
+import unittest
+import sys
+from threading import Thread, Barrier
+
+from test.support import threading_helper
+
+threading_helper.requires_working_threading(module=True)
+
+class EnumerateThreading(unittest.TestCase):
+
+ @threading_helper.reap_threads
+ def test_threading(self):
+ number_of_threads = 10
+ number_of_iterations = 8
+ n = 100
+ start = sys.maxsize - 40
+ barrier = Barrier(number_of_threads)
+ def work(enum):
+ barrier.wait()
+ while True:
+ try:
+ _ = next(enum)
+ except StopIteration:
+ break
+
+ for it in range(number_of_iterations):
+ enum = enumerate(tuple(range(start, start + n)))
+ worker_threads = []
+ for ii in range(number_of_threads):
+ worker_threads.append(
+ Thread(target=work, args=[enum]))
+ with threading_helper.start_threads(worker_threads):
+ pass
+
+ barrier.reset()
+
+if __name__ == "__main__":
+ unittest.main()