mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-123471: Make itertools.product and itertools.combinations thread-safe (#132814)
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
		
							parent
							
								
									b1056c2a44
								
							
						
					
					
						commit
						847d1c2cb4
					
				
					 3 changed files with 74 additions and 2 deletions
				
			
		
							
								
								
									
										51
									
								
								Lib/test/test_free_threading/test_itertools_combinatoric.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Lib/test/test_free_threading/test_itertools_combinatoric.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| import unittest | ||||
| from threading import Thread, Barrier | ||||
| from itertools import combinations, product | ||||
| from test.support import threading_helper | ||||
| 
 | ||||
| 
 | ||||
| threading_helper.requires_working_threading(module=True) | ||||
| 
 | ||||
| def test_concurrent_iteration(iterator, number_of_threads): | ||||
|     barrier = Barrier(number_of_threads) | ||||
|     def iterator_worker(it): | ||||
|         barrier.wait() | ||||
|         while True: | ||||
|             try: | ||||
|                 _ = next(it) | ||||
|             except StopIteration: | ||||
|                 return | ||||
| 
 | ||||
|     worker_threads = [] | ||||
|     for ii in range(number_of_threads): | ||||
|         worker_threads.append( | ||||
|             Thread(target=iterator_worker, args=[iterator])) | ||||
| 
 | ||||
|     with threading_helper.start_threads(worker_threads): | ||||
|         pass | ||||
| 
 | ||||
|     barrier.reset() | ||||
| 
 | ||||
| class ItertoolsThreading(unittest.TestCase): | ||||
| 
 | ||||
|     @threading_helper.reap_threads | ||||
|     def test_combinations(self): | ||||
|         number_of_threads = 10 | ||||
|         number_of_iterations = 24 | ||||
| 
 | ||||
|         for it in range(number_of_iterations): | ||||
|             iterator = combinations((1, 2, 3, 4, 5), 2) | ||||
|             test_concurrent_iteration(iterator, number_of_threads) | ||||
| 
 | ||||
|     @threading_helper.reap_threads | ||||
|     def test_product(self): | ||||
|         number_of_threads = 10 | ||||
|         number_of_iterations = 24 | ||||
| 
 | ||||
|         for it in range(number_of_iterations): | ||||
|             iterator = product((1, 2, 3, 4, 5), (10, 20, 30)) | ||||
|             test_concurrent_iteration(iterator, number_of_threads) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     unittest.main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Pieter Eendebak
						Pieter Eendebak