PEP-734 has been accepted (for 3.14). (FTR, I'm opposed to putting this under the concurrent package, but doing so is the SC condition under which the module can land in 3.14.)
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
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.
|
|
import_helper.import_module('_interpreters')
|
|
from concurrent 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)
|
|
del alive
|
|
support.gc_collect()
|
|
|
|
@support.bigmemtest(size=200, memuse=32*2**20, dry_run=False)
|
|
def test_create_many_threaded(self, size):
|
|
alive = []
|
|
start = threading.Event()
|
|
def task():
|
|
# try to create all interpreters simultaneously
|
|
if not start.wait(support.SHORT_TIMEOUT):
|
|
raise TimeoutError
|
|
interp = interpreters.create()
|
|
alive.append(interp)
|
|
threads = [threading.Thread(target=task) for _ in range(size)]
|
|
with threading_helper.start_threads(threads):
|
|
start.set()
|
|
del alive
|
|
support.gc_collect()
|
|
|
|
@threading_helper.requires_working_threading()
|
|
@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()
|
|
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')
|
|
# try to run all interpreters simultaneously
|
|
if not start.wait(support.SHORT_TIMEOUT):
|
|
raise TimeoutError
|
|
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
|
|
|
|
threads = [threading.Thread(target=run) for _ in range(size)]
|
|
with threading_helper.start_threads(threads):
|
|
start.set()
|
|
support.gc_collect()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Test needs to be a package, so we can do relative imports.
|
|
unittest.main()
|