import structio import signal from types import FrameType ev = structio.Event() async def handler(sig: signal.Signals, _frame: FrameType): print( f"[handler] Handling signal {signal.Signals(sig).name!r}, waiting 1 second before setting event" ) # Just to show off the async part await structio.sleep(1) ev.set() async def main(n): print("[main] Main is alive, setting signal handler") assert structio.get_signal_handler(signal.SIGALRM) is None structio.set_signal_handler(signal.SIGALRM, handler) assert structio.get_signal_handler(signal.SIGALRM) is handler print(f"[main] Signal handler set, calling signal.alarm({n})") signal.alarm(n) print("[main] Alarm scheduled, waiting on global event") t = structio.clock() await ev.wait() print(f"[main] Exited in {structio.clock() - t:.2f} seconds") async def handler_2(sig: signal.Signals, _frame: FrameType): print( f"[handler] Handling signal {signal.Signals(sig).name!r}, waiting 1 second before exiting" ) await structio.sleep(1) async def main_2(n): structio.set_signal_handler(signal.SIGHUP, handler_2) t = structio.clock() while n: signal.raise_signal(signal.SIGHUP) print(f"[main] Sleeping half a second ({n=})") await structio.sleep(0.5) n -= 1 print(f"[main] Done in {structio.clock() - t:.2f} seconds") structio.run(main_2, 5) structio.run(main, 5)