Форум сайта python.su
Есть функция выхода:
def sys_exit():
print u'Работа программы завершена...'
sys.exit(1)
os.kill(0,signal.SIGKILL)
Офлайн
Возможно, у вас остался работающий non-daemon thread.
Офлайн
Совершенно верно, потоки есть. Но у потоков нет метода их завершения, на сколько я понял. После запуска run поток будет вполняться неограниченно долго.
А если потоков еще не запущено, то sys.exit вообще ничего не делает. Странно это как-то
Офлайн
Вроде как после завершения родительского процесса все потоки должны завершаться? что-то этого не наблюдается…. Хочется услышать мнение профессионалов на этот счет.
Офлайн
Давайте сначала о sys.exit.
Вызов этой функции просто выбрасывает исключение SystemExit.
Которое обычно не ловится пользовательским кодом, а выпадает наружу, где и обрабатывается как завершение процесса.
Теперь о потоках.
Они бывают daemon и не daemon.
Обычные - не демоны. Они должны закончиться перед завершением программы. Питон будет их ждать, если нужно.
threading.Thread API не имеет метода “прибить поток”, и это правильно. Принудительное завершение потока не может быть безопасным по определению.
По правильному это делается через установку флага/события или еще чего нибудь, на что поток должен ответить завершением. А после установки флажка - дождаться через .join()
Поток можно переключить через setDaemon(True) перед стартом. Запущенный поток сделать демоном нельзя.
Питон не ожидает завершения демонов при финише.
Несмотря на кажущуюся привлекательность сильно не рекомендую их использовать.
Первое: как правило, демоны - признак плохого дизайна. Незамутненный “код с душком” по Фаулеру.
Вторая причина прозаичней и веселее. Потоки-демоны живут еще чуть-чуть после завершения главного потока. Сколько - заранее не скажешь. Просто планировщик может успеть сделать несколько переключений на них. И окружение в это время наполовину разрушено. Т.е. может уже не быть каких-нибудь модулей или глобальных объектов. В результате поток уваливается на какой-нибудь весьма странной ошибке. Которая еще и не воспроизводится стабильно.
Резюме: за своими потоками нужно следить. Если создал поток - всегда дождись его .join() Если поток нужно прервать - выставляй сигнал и анализируй его внутри потока. Отступления от правил караются средой исполнения.
Отредактировано (Май 9, 2010 20:56:18)
Офлайн
Андрей, вы не думали книгу написать? Все время интересные места выбираете и излагаете ясно.
Офлайн
Книгу писать - это вам не на форуме языком молоть.
Всерьез - не думал.
Офлайн
напишите методичку :)
У вас отличное знание внутренностей, тем кто с питоном уже на ты, будет приятно узнать о том как это работает, а то большиснтво книг дают такое среднеповерхностное знание об этом.
Отредактировано (Май 11, 2010 20:13:57)
Офлайн
А вы читайте исходники перед сном. Чужие, разумеется - на чтении своих научиться невозможно.
У CPython, к слову, довольно простой и понятный код. В отличие от многих питонячьих библиотек.
Офлайн