import signal import time import argparse from os import getpid import asyncio from concurrent.futures import ProcessPoolExecutor def process_worker(id, do_set_wakeup_fd): print('%d Worker %d started' %(getpid(), id)) if do_set_wakeup_fd: # This is a workaround for replicated SIGINT signals in the parent from child processes signal.set_wakeup_fd(-1) time.sleep(1) async def main(args): loop = asyncio.get_running_loop() global num_sigs, stop_signal num_sigs = 0 stop_signal = loop.create_future() def handler(signum): print('%d received signal:' % getpid(), signum) global num_sigs, stop_signal num_sigs += 1 if num_sigs == 6: stop_signal.set_result(True) for signame in ('SIGINT','SIGTERM'): loop.add_signal_handler(getattr(signal, signame), handler, getattr(signal, signame)) print('%d Signal Handler set' % getpid()) with ProcessPoolExecutor(max_workers=2) as executor: worker1 = asyncio.get_running_loop().run_in_executor(executor, process_worker, 1, args.set_in_children) worker2 = asyncio.get_running_loop().run_in_executor(executor, process_worker, 2, args.set_in_children) await stop_signal await worker1 await worker2 if __name__ == '__main__': parser = argparse.ArgumentParser(description='') parser.add_argument('--set-in-children', action='store_true') asyncio.run(main(parser.parse_args()))