2023-06-19 17:34:44 +02:00
|
|
|
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")
|
|
|
|
|
|
|
|
|
2023-06-19 19:10:00 +02:00
|
|
|
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)
|
2023-06-19 17:34:44 +02:00
|
|
|
structio.run(main, 5)
|