mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			76 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from itertools import cycle
							 | 
						||
| 
								 | 
							
								from threading import Event, Thread
							 | 
						||
| 
								 | 
							
								from unittest import TestCase
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from test.support import threading_helper
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@threading_helper.requires_working_threading()
							 | 
						||
| 
								 | 
							
								class TestStr(TestCase):
							 | 
						||
| 
								 | 
							
								    def test_racing_join_extend(self):
							 | 
						||
| 
								 | 
							
								        '''Test joining a string being extended by another thread'''
							 | 
						||
| 
								 | 
							
								        l = []
							 | 
						||
| 
								 | 
							
								        ITERS = 100
							 | 
						||
| 
								 | 
							
								        READERS = 10
							 | 
						||
| 
								 | 
							
								        done_event = Event()
							 | 
						||
| 
								 | 
							
								        def writer_func():
							 | 
						||
| 
								 | 
							
								            for i in range(ITERS):
							 | 
						||
| 
								 | 
							
								                l.extend(map(str, range(i)))
							 | 
						||
| 
								 | 
							
								                l.clear()
							 | 
						||
| 
								 | 
							
								            done_event.set()
							 | 
						||
| 
								 | 
							
								        def reader_func():
							 | 
						||
| 
								 | 
							
								            while not done_event.is_set():
							 | 
						||
| 
								 | 
							
								                ''.join(l)
							 | 
						||
| 
								 | 
							
								        writer = Thread(target=writer_func)
							 | 
						||
| 
								 | 
							
								        readers = []
							 | 
						||
| 
								 | 
							
								        for x in range(READERS):
							 | 
						||
| 
								 | 
							
								            reader = Thread(target=reader_func)
							 | 
						||
| 
								 | 
							
								            readers.append(reader)
							 | 
						||
| 
								 | 
							
								            reader.start()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        writer.start()
							 | 
						||
| 
								 | 
							
								        writer.join()
							 | 
						||
| 
								 | 
							
								        for reader in readers:
							 | 
						||
| 
								 | 
							
								            reader.join()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_racing_join_replace(self):
							 | 
						||
| 
								 | 
							
								        '''
							 | 
						||
| 
								 | 
							
								        Test joining a string of characters being replaced with ephemeral
							 | 
						||
| 
								 | 
							
								        strings by another thread.
							 | 
						||
| 
								 | 
							
								        '''
							 | 
						||
| 
								 | 
							
								        l = [*'abcdefg']
							 | 
						||
| 
								 | 
							
								        MAX_ORDINAL = 1_000
							 | 
						||
| 
								 | 
							
								        READERS = 10
							 | 
						||
| 
								 | 
							
								        done_event = Event()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def writer_func():
							 | 
						||
| 
								 | 
							
								            for i, c in zip(cycle(range(len(l))),
							 | 
						||
| 
								 | 
							
								                            map(chr, range(128, MAX_ORDINAL))):
							 | 
						||
| 
								 | 
							
								                l[i] = c
							 | 
						||
| 
								 | 
							
								            done_event.set()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def reader_func():
							 | 
						||
| 
								 | 
							
								            while not done_event.is_set():
							 | 
						||
| 
								 | 
							
								                ''.join(l)
							 | 
						||
| 
								 | 
							
								                ''.join(l)
							 | 
						||
| 
								 | 
							
								                ''.join(l)
							 | 
						||
| 
								 | 
							
								                ''.join(l)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        writer = Thread(target=writer_func)
							 | 
						||
| 
								 | 
							
								        readers = []
							 | 
						||
| 
								 | 
							
								        for x in range(READERS):
							 | 
						||
| 
								 | 
							
								            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()
							 |