| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | import threading | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from test import support | 
					
						
							|  |  |  | from test.support import import_helper | 
					
						
							|  |  |  | from test.support import threading_helper | 
					
						
							|  |  |  | # Raise SkipTest if subinterpreters not supported. | 
					
						
							| 
									
										
										
										
											2024-04-24 10:18:24 -06:00
										 |  |  | import_helper.import_module('_interpreters') | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | from test.support import interpreters | 
					
						
							|  |  |  | from .utils import TestBase | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class StressTests(TestBase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # In these tests we generally want a lot of interpreters, | 
					
						
							|  |  |  |     # but not so many that any test takes too long. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @support.requires_resource('cpu') | 
					
						
							|  |  |  |     def test_create_many_sequential(self): | 
					
						
							|  |  |  |         alive = [] | 
					
						
							|  |  |  |         for _ in range(100): | 
					
						
							|  |  |  |             interp = interpreters.create() | 
					
						
							|  |  |  |             alive.append(interp) | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |         del alive | 
					
						
							|  |  |  |         support.gc_collect() | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |     @support.bigmemtest(size=200, memuse=32*2**20, dry_run=False) | 
					
						
							|  |  |  |     def test_create_many_threaded(self, size): | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  |         alive = [] | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |         start = threading.Event() | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  |         def task(): | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |             # try to create all interpreters simultaneously | 
					
						
							|  |  |  |             if not start.wait(support.SHORT_TIMEOUT): | 
					
						
							|  |  |  |                 raise TimeoutError | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  |             interp = interpreters.create() | 
					
						
							|  |  |  |             alive.append(interp) | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |         threads = [threading.Thread(target=task) for _ in range(size)] | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  |         with threading_helper.start_threads(threads): | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |             start.set() | 
					
						
							|  |  |  |         del alive | 
					
						
							|  |  |  |         support.gc_collect() | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-19 12:59:19 -07:00
										 |  |  |     @threading_helper.requires_working_threading() | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |     @support.bigmemtest(size=200, memuse=34*2**20, dry_run=False) | 
					
						
							|  |  |  |     def test_many_threads_running_interp_in_other_interp(self, size): | 
					
						
							|  |  |  |         start = threading.Event() | 
					
						
							| 
									
										
										
										
											2024-11-19 12:59:19 -07:00
										 |  |  |         interp = interpreters.create() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         script = f"""if True:
 | 
					
						
							|  |  |  |             import _interpreters | 
					
						
							|  |  |  |             _interpreters.run_string({interp.id}, '1') | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def run(): | 
					
						
							|  |  |  |             interp = interpreters.create() | 
					
						
							|  |  |  |             alreadyrunning = (f'{interpreters.InterpreterError}: ' | 
					
						
							|  |  |  |                               'interpreter already running') | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |             # try to run all interpreters simultaneously | 
					
						
							|  |  |  |             if not start.wait(support.SHORT_TIMEOUT): | 
					
						
							|  |  |  |                 raise TimeoutError | 
					
						
							| 
									
										
										
										
											2024-11-19 12:59:19 -07:00
										 |  |  |             success = False | 
					
						
							|  |  |  |             while not success: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     interp.exec(script) | 
					
						
							|  |  |  |                 except interpreters.ExecutionFailed as exc: | 
					
						
							|  |  |  |                     if exc.excinfo.msg != 'interpreter already running': | 
					
						
							|  |  |  |                         raise  # re-raise | 
					
						
							|  |  |  |                     assert exc.excinfo.type.__name__ == 'InterpreterError' | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     success = True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |         threads = [threading.Thread(target=run) for _ in range(size)] | 
					
						
							| 
									
										
										
										
											2024-11-19 12:59:19 -07:00
										 |  |  |         with threading_helper.start_threads(threads): | 
					
						
							| 
									
										
										
										
											2025-05-04 21:53:24 +03:00
										 |  |  |             start.set() | 
					
						
							|  |  |  |         support.gc_collect() | 
					
						
							| 
									
										
										
										
											2024-11-19 12:59:19 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     # Test needs to be a package, so we can do relative imports. | 
					
						
							|  |  |  |     unittest.main() |