mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 15:41:43 +00:00 
			
		
		
		
	
		
			
	
	
		
			62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import threading
							 | 
						||
| 
								 | 
							
								from threading import Thread
							 | 
						||
| 
								 | 
							
								from unittest import TestCase
							 | 
						||
| 
								 | 
							
								import gc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from test.support import threading_helper
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MyObj:
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@threading_helper.requires_working_threading()
							 | 
						||
| 
								 | 
							
								class TestGC(TestCase):
							 | 
						||
| 
								 | 
							
								    def test_get_objects(self):
							 | 
						||
| 
								 | 
							
								        event = threading.Event()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def gc_thread():
							 | 
						||
| 
								 | 
							
								            for i in range(100):
							 | 
						||
| 
								 | 
							
								                o = gc.get_objects()
							 | 
						||
| 
								 | 
							
								            event.set()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def mutator_thread():
							 | 
						||
| 
								 | 
							
								            while not event.is_set():
							 | 
						||
| 
								 | 
							
								                o1 = MyObj()
							 | 
						||
| 
								 | 
							
								                o2 = MyObj()
							 | 
						||
| 
								 | 
							
								                o3 = MyObj()
							 | 
						||
| 
								 | 
							
								                o4 = MyObj()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        gcs = [Thread(target=gc_thread)]
							 | 
						||
| 
								 | 
							
								        mutators = [Thread(target=mutator_thread) for _ in range(4)]
							 | 
						||
| 
								 | 
							
								        with threading_helper.start_threads(gcs + mutators):
							 | 
						||
| 
								 | 
							
								            pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_get_referrers(self):
							 | 
						||
| 
								 | 
							
								        event = threading.Event()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        obj = MyObj()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def gc_thread():
							 | 
						||
| 
								 | 
							
								            for i in range(100):
							 | 
						||
| 
								 | 
							
								                o = gc.get_referrers(obj)
							 | 
						||
| 
								 | 
							
								            event.set()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def mutator_thread():
							 | 
						||
| 
								 | 
							
								            while not event.is_set():
							 | 
						||
| 
								 | 
							
								                d1 = { "key": obj }
							 | 
						||
| 
								 | 
							
								                d2 = { "key": obj }
							 | 
						||
| 
								 | 
							
								                d3 = { "key": obj }
							 | 
						||
| 
								 | 
							
								                d4 = { "key": obj }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        gcs = [Thread(target=gc_thread) for _ in range(2)]
							 | 
						||
| 
								 | 
							
								        mutators = [Thread(target=mutator_thread) for _ in range(4)]
							 | 
						||
| 
								 | 
							
								        with threading_helper.start_threads(gcs + mutators):
							 | 
						||
| 
								 | 
							
								            pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								    unittest.main()
							 |