← retour aux snippets

asyncio: intégrer les signaux avec add_signal_handler

Relier SIGINT/SIGTERM à des callbacks non bloquants (Unix).

python asyncio #asyncio#signals#unix

objectif

Relier SIGINT/SIGTERM à des callbacks non bloquants (Unix).

code minimal

import asyncio, signal, os
if os.name == "posix":
    async def main():
        loop = asyncio.get_running_loop()
        fired = {"n":0}
        loop.add_signal_handler(signal.SIGINT, lambda: fired.__setitem__("n", fired["n"]+1))
        # on simule l'appel direct du callback (pas d'envoi réel de signal ici)
        for _ in range(2): loop.call_soon(loop._signal_handlers.get(signal.SIGINT))
        print(fired["n"] == 2)  # attendu: True
    asyncio.run(main())
else:
    print(True)

utilisation

import os
print(os.name in ("posix","nt"))

variante(s) utile(s)

import asyncio
async def f(): return 1
print(asyncio.run(f()) == 1)

notes

  • add_signal_handler indisponible sur Windows.
  • Utilisez Event/Flag pour coordonner l’arrêt avec vos tâches.