Форум сайта python.su
0
Всем привет!
Python 2.7 (Windows, Linux).
Написал простейшее многопоточное приложение.
Программа состоит из одного файла. В нем основной поток запускает дочерний поток (модуль threading).
Запускаю программу в терминале. Необходимо перехватить нажатие Ctrl-C, чтобы правильно завершить работу программы.
Сделал в основном потоке:
try ... except KeyboardInterrupt: # Сообщение о завершении работы и завершение работы. ...
Офлайн
75
может надо запуст потоков в блок try запихнуть?
Офлайн
88
kolunaА как Вы это обнаружили?
Но обнаружил, что исключение обрабатывается не всегда!
Офлайн
0
Singularity
может надо запуст потоков в блок try запихнуть?
Офлайн
0
Shaman
Офлайн
0
Я пока не пойму как обрабывается Ctrl-C в многопоточном приложении.
Исключение KeyboardInterrupt приходит только основному потоку? Всем потокам? Или тому потоку, который в данный момент выполняется?
Офлайн
88
Офлайн
0
Прочитал разочек, но прозрения полного пока не наступило 
У меня join() вообще в finally стоит.
Т. е., я в главном потоке ловлю KeyboardInterrupt, выставляю event, жду join, дочерний поток проверяет этот event и если он установлен - выходим из функции потока.
В общем, код такой:
import threading event = threading.Event() def func(ev): while not ev.is_set(): print 'Work.' a = 0 for i in xrange(10000000): a += i ev.clear() print 'Stopped!' try: thr = threading.Thread(target=func, args=(event, )) print 'Started.' thr.start() while True: pass except KeyboardInterrupt: print 'Ctrl-C!!!' finally: print 'End.' event.set() thr.join()
Отредактировано koluna (Июль 8, 2014 17:07:11)
Офлайн