Посты с тэгом signal


Python: модуль signal. Перевод документации. Примеры.

Модуль предоставляет механизм использования обработчиков сигналов. Некоторые общие правила для работ с сигналами и их обработчиками:
  • Обработчик для конкретного сигнала, однажды установленный, остается таковым пока не будет явного сброса (Python эмулирует интерфейс в стиле BSD, независимо от конкретной реализации), за исключением обработчика для SIGCHLD, который следует за базовой реализации.
  • Не существует способа временно "заблокировать" сигналы от критических секций (так как это не поддерживается для всех разновидностей Unix).
  • Хотя обработчики сигналов в Python вызываются асинхронно, в этом заинтересован пользователь Python, они могут проявиться только между атомарными инструкциями интерпретатора Python. Это означает что сигналы поступившие во время длительных вычислительным реализаций на чистом C (такие как поиск совпадение регулярного выражения в большом фрагменте текста) могут быть отложены на произвольное количество времени.
  • Когда сигна


Python / [Ссылка] Дополнение к статье о GIL: обработка сигналов

Питон может вести себя очень необычно, не реагируя на зарегистрированные сигналы posix.

Например, на Ctrl-C программа не обращает внимание, хотя обработчик был правильно зарегистрирован.

Статья раскрывает это поведение и предлагает (вкратце) методы решения.



GIL и обработка сигналов

Небольшое добавление к статье о GIL.

Эта часть касается только поведения Питона на posix системах. Я проводил эксперимент на Linux, но на FreeBSD и MacOS результат должен быть тем же. На Windows свои тараканы, к последующему изложению не имеющие никакого отношения.

Описание проблемы

Итак, имеем простой код:

import threading

threads = []

running = True

def f():
    while running:
        pass

for i in range(1):
    th = threading.Thread(target=f)
    threads.append(th)
    th.start()

for th in threads:
    th.join()

Что произойдет, если после запуска пользователь нажмет <Ctrl+C>? Будет послан сигнал SIGINT, который мы не умеем обрабатывать.

Отлично, добавим нужное:

import threading
import signal

threads = []

running = True

def f():
    while running:
        pa