import concurrent.futures import tempfile import os import shutil import subprocess def task(kind): dirname = tempfile.mkdtemp() f_w = open(os.path.join(dirname, "stdout.txt"), "w") if kind == "subprocess_devnull": with subprocess.Popen("dir", shell=True, stdout=subprocess.DEVNULL) as p: pass elif kind == "subprocess_redirfile": with subprocess.Popen("dir", shell=True, stdout=f_w) as p: pass elif kind == "nosubprocess": pass else: raise ValueError("invalid value {}".format(kind)) f_w.close() shutil.rmtree(dirname) def execute_tasks(N, parallel, kind): print("Concurrency:", parallel) print("Task kind:", kind) results = [] def task_done(f): if f.exception() is None: results.append(True) else: results.append(f.exception()) threadpool = concurrent.futures.ThreadPoolExecutor(max_workers=parallel) for i in range(N): threadpool.submit(task, kind).add_done_callback(task_done) threadpool.shutdown() print("{} errors of {}".format(len([r for r in results if r is not True]), len(results))) print() import platform print(platform.platform()) execute_tasks(10, 2, "subprocess_redirfile") execute_tasks(10, 1, "subprocess_redirfile") execute_tasks(10, 2, "subprocess_devnull") execute_tasks(10, 1, "subprocess_devnull") execute_tasks(10, 2, "nosubprocess") execute_tasks(10, 1, "nosubprocess")