import asyncio import os import signal import time loop = asyncio.get_event_loop() pid = os.fork() if pid == 0: loop.close() signal.pause() else: acknowledge_sigchild = asyncio.Future() def acknowledge(*args): print("ack sigchld", *args) acknowledge_sigchild.set_result(None) with asyncio.get_child_watcher() as watcher: watcher.add_child_handler(pid, acknowledge) time.sleep(1) print("sending sigterm") os.kill(pid, signal.SIGTERM) # Uncomment to fix the deadlock #loop.remove_reader(loop._ssock) #loop.add_reader(loop._ssock, loop._read_from_self) loop.run_until_complete(acknowledge_sigchild) # deadlock