structio/tests/signals.py

50 lines
1.4 KiB
Python

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)