Обработка сигналов в потоках Python - PullRequest
8 голосов
/ 06 января 2011

У меня есть потоковое приложение, написанное на Python, и всякий раз, когда прерывание получено с помощью Ctrl + C или иногда с помощью kill, приложение зависает.Трассировка стека представляется из одного потока, но приложение остается на переднем плане, и мне обычно приходится фонировать его с помощью Ctrl + Z , затем пытаться убитьit.

Как правильно обрабатывать сигналы и прерывания клавиатуры внутри многопоточного приложения?

Ответы [ 4 ]

14 голосов
/ 06 января 2011

Если вы установите newthread.daemon = True перед запуском каждого потока, потоки будут автоматически уничтожены при выходе из основного потока. Это не совсем то, что вы спрашивали, но из того, что вы описали, звучит так, как будто это стоит знать.

5 голосов
/ 06 января 2011

Потоки CPython: Прерывание охватывает то, что происходит с сигналами в потоках Python, и различные решения вашей проблемы.Это хорошее чтение.

5 голосов
/ 06 января 2011

Чтобы обойти эту проблему, я создал модуль, который мог бы хранить список потоков.В модуле также был метод, который убивал все потоки в этом списке.Я зарегистрировал этот метод для вызова при получении сигнала SIGINT.Наконец, я создал класс-оболочку для Thread, который автоматически добавит созданный экземпляр в список потоков.

1 голос
/ 06 января 2011

Используйте сигнальный модуль и продолжайте читать здесь Обработчики сигналов и регистрация в Python о возможных подводных камнях.

Чтобы поймать Ctrl+C действий пользователя, вы должны получить обработчик signal для SIGINT.

Внутри обработчика сигнала уведомить (очереди сообщений или доступ к синхронизированным атрибутам RLock) о прекращении работы ваших потоков или о том, что вы собираетесь делать.

...