Найти - Пользователи
Полная версия: Прерывание multithreading приложения по ctrl+c
Начало » Python для новичков » Прерывание multithreading приложения по ctrl+c
1
$m1t
Есть следующий код
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
Андрей Светлов
Делай раз:
- каждый поток должен быть завершен, т.е. th1.join() не напрасно придуман. В этом примере не нужно, но правило хорошее.
Делай два:
- если приложение закрывается - нужно сказать всем потокам о завершении. Флажочек выставить в крайнем случае. Пусть закроются не сразу, а после того как сделают твой re.findall например.
Делай три:
- когда в главном потоке поймал KeyboardInterrupt (SystemExit или что там еще хочется) - заявляй о прекращении банкета.

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

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

P.S. Хороший пример. Можно понять, что хотелось - и нет лишнего. Лучший - тот, который можно воспроизвести. Качнуть google.com и попытаться найти там какой-нибудь случайный символ, к примеру.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB