Я тестирую потоки Python с помощью следующего скрипта:
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
Это работает в Python 2.7 на Kubuntu 11.10. Ctrl+ Cне убьет. Я также пробовал добавить обработчик системных сигналов, но это не помогло:
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
Чтобы убить процесс, я убиваю его с помощью PID после отправки программы в фоновый режим с помощью Ctrl+ Z, который не игнорируется. Почему Ctrl+ Cигнорируются так настойчиво? Как я могу это решить?
Ответы:
Ctrl+ Cзавершает основной поток, но поскольку ваши потоки не в режиме демона, они продолжают работать, и это поддерживает процесс. Мы можем сделать их демонами:
Но есть еще одна проблема: как только основной поток запустил ваши потоки, ему больше нечего делать. Итак, он завершается, и потоки уничтожаются мгновенно. Итак, оставим основной поток живым:
Теперь он будет печатать «первый» и «второй», пока вы не нажмете Ctrl+ C.
Изменить: как указывали комментаторы, потоки демона могут не получить возможности очистить такие вещи, как временные файлы. Если вам это нужно, то поймайте
KeyboardInterrupt
основной поток и попросите его координировать очистку и завершение работы. Но во многих случаях, вероятно, достаточно позволить потокам демонов внезапно умереть.источник
tempfile.TemporaryFile()
например, можно оставить на диске.daemon=True
кThread.__init__
KeyboardInterrupt и сигналы видны только процессу (т.е. основному потоку) ... Взгляните на Ctrl-c, т.е. KeyboardInterrupt, чтобы убить потоки в python
источник
Я думаю, что лучше вызывать join () для ваших потоков, когда вы ожидаете, что они умрут. Я взял на себя некоторую вольность с вашим кодом, чтобы цикл закончился (вы также можете добавить туда все, что потребуется для очистки). Переменная die проверяется на истинность при каждом проходе, и когда она истинна, программа завершается.
источник
while True
глупо, вы должныjoin
прямо - и эта функция переопределения вызывает сомнения. Можетdef join(self, force=False): if force: self.die = True
так чтоjoin()
без измененийjoin(force=True)
убивает их. Но даже в этом случае лучше сообщить обоим потокам, прежде чем присоединяться к любому из них.Улучшенная версия ответа @Thomas K:
is_any_thread_alive()
соответствии с этой сутью , которая можетmain()
автоматически завершать работу .Примеры кодов:
источник