diff options
author | Pieter Eendebak <pieter.eendebak@gmail.com> | 2025-03-13 19:44:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-14 00:14:05 +0530 |
commit | ec46a55d63eaf015c2cd544b8c727ed7cbb81d33 (patch) | |
tree | b488e230530b1e3d78d6217ac6d1df307ee64697 /Lib/test/test_free_threading/test_enumerate.py | |
parent | 7ea6e88eb490635518c63c3305c03baf3e151555 (diff) | |
download | cpython-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.py | 38 |
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() |