| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  | NTHREAD = 10 | 
					
						
							|  |  |  | OBJECT_COUNT = 5_000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 = [] | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |         for x in range(NTHREAD): | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  |             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): | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |         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() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |