| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from threading import Thread | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 16:45:04 -07:00
										 |  |  | from test.support import threading_helper | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class C: | 
					
						
							|  |  |  |     def __init__(self, v): | 
					
						
							|  |  |  |         self.v = v | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 16:45:04 -07:00
										 |  |  | @threading_helper.requires_working_threading() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | class TestList(TestCase): | 
					
						
							|  |  |  |     def test_racing_iter_append(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         l = [] | 
					
						
							|  |  |  |         OBJECT_COUNT = 10000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def writer_func(): | 
					
						
							|  |  |  |             for i in range(OBJECT_COUNT): | 
					
						
							|  |  |  |                 l.append(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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |