import concurrent.futures import sys import io import time import threaded_redirect def print_slowly(message, count=3, delay=0.1): for _ in range(count): print(message) time.sleep(delay) def check_print_slowly(message): sio = io.StringIO() with threaded_redirect.redirect_stdout(sio): print_slowly(message) assert sio.getvalue() == 3 * f"{message}\n" print(f"OK {message}") orig_stdout = sys.stdout check_print_slowly(3) assert orig_stdout is sys.stdout check_print_slowly(4) assert orig_stdout is sys.stdout check_print_slowly(5) assert orig_stdout is sys.stdout with concurrent.futures.ThreadPoolExecutor() as executor: for i in range(4): executor.submit(check_print_slowly, i) executor.shutdown()