Уведомления

Группа в Telegram: @pythonsu

#1 Июль 18, 2009 02:58:01

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание multithreading приложения по ctrl+c

Есть следующий код

import threading

def harvest(email, password):
br = Browser()
while 1:
id = br.open('http://127.0.0.1:8080').read()
text = bro.read()
reg = re.compile('u\d+')
items = re.findall(reg, text)
print items


if __name__ == "__main__":
th1 = threading.Thread(target=harvest, args=(email, password))
th2 = threading.Thread(target=harvest, args=(email2, password2))

th1.start()
th2.start()
так вот такое вот приложение в отличие от стандартного однотредового не реагирует на ctrl+c, однако отзывается на kill. Почему так происходит(казалось бы в обоих случаях SIGNTERM посылается) и как сделать убивание по ctrl+c ? os ubuntu



Офлайн

#2 Июль 18, 2009 05:02:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Прерывание multithreading приложения по ctrl+c

Делай раз:
- каждый поток должен быть завершен, т.е. th1.join() не напрасно придуман. В этом примере не нужно, но правило хорошее.
Делай два:
- если приложение закрывается - нужно сказать всем потокам о завершении. Флажочек выставить в крайнем случае. Пусть закроются не сразу, а после того как сделают твой re.findall например.
Делай три:
- когда в главном потоке поймал KeyboardInterrupt (SystemExit или что там еще хочется) - заявляй о прекращении банкета.

Есть еще вариант - неправильный.
Сказать th1.setDaemon(True)
Но тогда поток завершиться мгновенно, и можно легко поиметь порванные данные.

Я советую как лучше, а там уж тебе решать, что ближе: надежность или “авось пронесет”.
Многие выбирают второй пункт, как не прискорбно.

P.S. Хороший пример. Можно понять, что хотелось - и нет лишнего. Лучший - тот, который можно воспроизвести. Качнуть google.com и попытаться найти там какой-нибудь случайный символ, к примеру.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version