2013-10-06 2 views
10

Из документов: http://docs.python.org/2/library/threadЧто происходит с другими потоками, когда главный поток вызывает sys.exit()?

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

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

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

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

+0

Напишите код и попробуйте его –

+2

Казалось бы, модуль 'thread' обрабатывает все как потоки демона, а' threading' добавляет концепцию потоков «non daemon». –

+0

@ user2799617: Я написал код и пришел к выводу, что нить не-демона действительно не убивается, когда главный поток выходит ».Вот почему мне интересно, когда применяется первая цитата, так как моя система, вероятно, является одной из тех «самых других систем»: Ubuntu 12.10 работает python 2.7 – gjain

ответ

8

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

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

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

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

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

Смежные вопросы