_signals.py 1016 B

1234567891011121314151617181920212223242526272829
  1. from __future__ import annotations
  2. from collections.abc import AsyncIterator
  3. from contextlib import AbstractContextManager
  4. from signal import Signals
  5. from ._eventloop import get_async_backend
  6. def open_signal_receiver(
  7. *signals: Signals,
  8. ) -> AbstractContextManager[AsyncIterator[Signals]]:
  9. """
  10. Start receiving operating system signals.
  11. :param signals: signals to receive (e.g. ``signal.SIGINT``)
  12. :return: an asynchronous context manager for an asynchronous iterator which yields
  13. signal numbers
  14. :raises NoEventLoopError: if no supported asynchronous event loop is running in the
  15. current thread
  16. .. warning:: Windows does not support signals natively so it is best to avoid
  17. relying on this in cross-platform applications.
  18. .. warning:: On asyncio, this permanently replaces any previous signal handler for
  19. the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`.
  20. """
  21. return get_async_backend().open_signal_receiver(*signals)