Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2010 20:43:34

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает sys.exit(1)

Есть функция выхода:

def sys_exit():
print u'Работа программы завершена...'
sys.exit(1)
Так вот программа, после ее вызова не завершается. Выводит принт и все.
Приходится использовать:
os.kill(0,signal.SIGKILL)
В чем может быть дело?
система ubuntu…10, до этого была 9, то же самое.
Спасибо.



Офлайн

#2 Май 7, 2010 21:55:51

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

Не работает sys.exit(1)

Возможно, у вас остался работающий non-daemon thread.



Офлайн

#3 Май 8, 2010 14:42:40

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает sys.exit(1)

Совершенно верно, потоки есть. Но у потоков нет метода их завершения, на сколько я понял. После запуска run поток будет вполняться неограниченно долго.
А если потоков еще не запущено, то sys.exit вообще ничего не делает. Странно это как-то



Офлайн

#4 Май 8, 2010 21:49:09

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает sys.exit(1)

Вроде как после завершения родительского процесса все потоки должны завершаться? что-то этого не наблюдается…. Хочется услышать мнение профессионалов на этот счет.



Офлайн

#5 Май 8, 2010 23:05:36

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

Не работает sys.exit(1)

Давайте сначала о sys.exit.
Вызов этой функции просто выбрасывает исключение SystemExit.
Которое обычно не ловится пользовательским кодом, а выпадает наружу, где и обрабатывается как завершение процесса.

Теперь о потоках.
Они бывают daemon и не daemon.
Обычные - не демоны. Они должны закончиться перед завершением программы. Питон будет их ждать, если нужно.
threading.Thread API не имеет метода “прибить поток”, и это правильно. Принудительное завершение потока не может быть безопасным по определению.
По правильному это делается через установку флага/события или еще чего нибудь, на что поток должен ответить завершением. А после установки флажка - дождаться через .join()

Поток можно переключить через setDaemon(True) перед стартом. Запущенный поток сделать демоном нельзя.
Питон не ожидает завершения демонов при финише.
Несмотря на кажущуюся привлекательность сильно не рекомендую их использовать.
Первое: как правило, демоны - признак плохого дизайна. Незамутненный “код с душком” по Фаулеру.
Вторая причина прозаичней и веселее. Потоки-демоны живут еще чуть-чуть после завершения главного потока. Сколько - заранее не скажешь. Просто планировщик может успеть сделать несколько переключений на них. И окружение в это время наполовину разрушено. Т.е. может уже не быть каких-нибудь модулей или глобальных объектов. В результате поток уваливается на какой-нибудь весьма странной ошибке. Которая еще и не воспроизводится стабильно.

Резюме: за своими потоками нужно следить. Если создал поток - всегда дождись его .join() Если поток нужно прервать - выставляй сигнал и анализируй его внутри потока. Отступления от правил караются средой исполнения.



Отредактировано (Май 9, 2010 20:56:18)

Офлайн

#6 Май 9, 2010 10:59:11

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Не работает sys.exit(1)

Андрей, вы не думали книгу написать? Все время интересные места выбираете и излагаете ясно.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Май 11, 2010 16:57:31

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

Не работает sys.exit(1)

Книгу писать - это вам не на форуме языком молоть.
Всерьез - не думал.



Офлайн

#8 Май 11, 2010 20:12:43

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает sys.exit(1)

напишите методичку :)
У вас отличное знание внутренностей, тем кто с питоном уже на ты, будет приятно узнать о том как это работает, а то большиснтво книг дают такое среднеповерхностное знание об этом.



Отредактировано (Май 11, 2010 20:13:57)

Офлайн

#9 Май 11, 2010 22:10:52

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

Не работает sys.exit(1)

А вы читайте исходники перед сном. Чужие, разумеется - на чтении своих научиться невозможно.
У CPython, к слову, довольно простой и понятный код. В отличие от многих питонячьих библиотек.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version