import os import time import signal import logging logger = logging.getLogger("mp_test") def wait_for_reboot(): while 1: if signal.sigpending(): logger.info("Quitting inf loop") break time.sleep(1) def print_sigs(): for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGQUIT]: logger.info(signal.getsignal(sig)) def start_cmd(): logger.info(f"Signals for {os.getpid()}") print_sigs() wait_for_reboot() thread_pools = None def close_thread_pools(sig, stack): logger.info(f"{os.getpid()}: Caught signal {sig}") logger.info(f"{os.getpid()}: Closing pools") # thread_pools.close() logger.info(f"{os.getpid()}: Terminating pools") thread_pools.terminate() logger.info(f"{os.getpid()}: Joining pools") thread_pools.join() logger.info(f"{os.getpid()}: Closed pools") def out(sig, stack): logger.info(f"{os.getpid()}: {sig}") def init_signals(handler): signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) signal.signal(signal.SIGQUIT, handler) if __name__ == "__main__": from multiprocessing import Pool, get_context, Value, log_to_stderr logger = log_to_stderr() logger.setLevel(logging.DEBUG) # thread_pools = get_context("spawn").Pool(processes=1, initializer=init_signals(out)) # thread_pools = Pool(processes=1, maxtasksperchild=1) thread_pools = Pool(processes=1) init_signals(close_thread_pools) print_sigs() a = thread_pools.apply_async(start_cmd) a.get()