получение сигнала linux и взаимодействие с потоками - PullRequest
1 голос
/ 25 ноября 2010

привет всем вам:)
У меня есть программа, которая имеет n потоков (может быть много), и они делают довольно обширную работу. Моя проблема в том, что иногда некоторые люди выключают или перезагружают сервер (программа работает весь день на серверах компании). Я знаю, что есть способ создать обработчик для сигналов linux. все потоки, заставляющие их использовать, запускают функцию и затем перестают работать. Есть способ сделать это?

извините за плохой английский: P

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Лучший способ справиться с этим - вообще не требовать каких-либо действий по отключению.

Например, ваш обработчик сигнала для (например) SIGTERM или SIGQUIT может просто вызвать _exit и выйти из процесса без очистки.

В Linux (с не древними потоками), когда один поток вызывает _exit (или завершается, если вы действительно хотите), другие потоки также останавливаются - что бы они ни делали.

Это было бы хорошо, так как в нем реализован проект «только при сбое».

Проект «только при сбое» для сервера основан на том принципе, что машина может дать сбой в любой момент, поэтому вам необходимо иметь возможность восстанавливаться после такогонеудача в любом случае, так что просто сделайте это нормальным способом выхода.Никакого дополнительного кода не требуется, поскольку ваш сервер в любом случае должен быть достаточно надежным.

1 голос
/ 25 ноября 2010

Как уже упоминали другие, обработчики сигналов могут запутаться (из-за ограничений, особенно в многопоточных программах), поэтому лучше выбрать другой вариант:

  • имеет специальный поток для обработки сигналов через sigwaitinfo - однако, плохая новость заключается в том, что python, похоже, не поддерживает это из коробки.

  • используйте специфичный для Linux signalfd для обработки сигналов (либо в отдельном потоке, либо в некотором цикле событий) - по крайней мере, есть модуль python-signalfd Вы можете использовать.

Поскольку здесь нет необходимости устанавливать обработчики сигналов, нет никаких ограничений в отношении того, что вы можете делать, когда вы получаете уведомление о сигнале, и должно быть легко легко закрыть другие потоки в вашей программе.

1 голос
/ 25 ноября 2010

Единственное, что вы можете сделать, это установить глобальную переменную из вашего обработчика сигнала, и ваши потоки периодически проверяют ее значение.

...