Что происходит с другими потоками, когда главный поток вызывает sys.exit()?

Из документов: http://docs.python.org/2/library/thread

Когда основной поток выходит, система определяет, будет ли другой потоки выживают. В SGI IRIX с использованием встроенной реализации потока, они выживают. В большинстве других систем они убиваются без выполнения try... finally clauses или выполнение деструкторов объектов.

И здесь, в документах (http://docs.python.org/2/library/threading), он говорит:

Поток может быть помечен как "поток демона". Значение этого flag заключается в том, что вся программа Python завершается, когда только потоки демона осталось. Начальное значение наследуется от создающего потока.

Здесь рассказывается только о не-демонах. Поскольку первая цитата не делает никакой особой ссылки на потоки не-демона, я бы предположил, что даже потоки не-демона должны быть убиты, если основной поток выходит. Однако вторая цитата предполагает иное. И фактически, нити не-демона действительно не убиваются, когда основной поток завершается. Итак, что точка первой цитаты здесь?

Ответ 1

Документация, к которой вы обращаетесь, состоит из двух разных модулей: thread и threading. thread - это низкоуровневый модуль, обеспечивающий более или менее прямой доступ к идее платформы о том, что означает "поток". threading обеспечивает более высокий уровень понятия "поток" с меньшей зависимостью от платформы.

Вот почему документы говорят разные вещи. То, что происходит с потоком thread низкого уровня при выходе, зависит от того, что делает потоковая версия платформы C, но в любом случае Python не пытается - или не закрывает их чисто.

A threading.Thread отличается. Часть обработки нормального завершения Python - это .join() потоки non-daemon threading.Thread. Таким образом, программа не закончится вообще до тех пор, пока не закончились потоки не-daemon threading.Thread (что является ответственностью программиста). Обратите внимание, что потоки модулей нижнего уровня thread не имеют понятия .join() - .join() - это концепция более высокого уровня, реализованная от в отдельном модуле threading.

Совет. Используйте threading вместо thread, если у вас нет отличных причин для использования thread. threading лучше вести себя и предоставляет множество полезных инструментов. Пример использования thread лучше? Я не могу думать об одном: -)

Примечание: в Python 3 низкоуровневый модуль thread переименовывается в _thread. Как обычно, ведущие подчёркивающие намеки "лучше не вмешиваться в это, но это здесь, если вам нужно".