2013-10-06 11 views
10

Od docs: http://docs.python.org/2/library/threadCo dzieje się z innymi wątkami, gdy główny wątek wywołuje sys.exit()?

Kiedy główne wyjścia gwintu, to układ zdefiniowany czy inne wątki przetrwać. W SGI IRIX przy użyciu natywnej implementacji wątku, one przetrwają. W większości innych systemów, są one zabijane bez wykonywania spróbuj ... wreszcie klauzule lub wykonywanie destruktorów obiektów.

I tu, w docs (http://docs.python.org/2/library/threading) mówi:

Wątek może być oznaczona jako „demon wątku”. Znaczenie tej flagi polega na tym, że cały program Python kończy działanie, gdy pozostaną tylko wątki demona . Wartość początkowa jest dziedziczona po utworzeniu wątku.

Porozmawiajmy tylko o wątkach nie będących demonami tutaj. Ponieważ pierwszy cytat nie zawiera żadnych specjalnych odniesień do wątków nie będących demonami, zakładam, że nawet wątki nie będące demonami powinny zostać zabite, jeśli główny wątek jest wychodzący. Drugi cytat sugeruje jednak, że jest inaczej. W rzeczywistości wątki nie będące demonami rzeczywiście nie są zabijane, gdy główny wątek się kończy. Jaki jest sens pierwszego cytatu tutaj?

+0

Napisz kod i wypróbuj go –

+2

Wygląda na to, że moduł "thread" obsługuje wszystko jako wątki demona, podczas gdy 'threading' dodaje pojęcie wątków" non daemon ". –

+0

@ user2799617: Napisałem kod i doszedłem do wniosku, że "wątki nie będące demonami rzeczywiście nie są zabijane, gdy główny wątek wychodzi".Dlatego zastanawiam się, kiedy pierwszy cytat ma zastosowanie, ponieważ mój system jest prawdopodobnie jednym z tych "większości innych systemów": Ubuntu 12.10 z pytonem 2.7 – gjain

Odpowiedz

8

Dokumentacja, do której się odnoszą, pochodzi z dwóch różnych różnych modułów: thread i threading. thread to moduł niskiego poziomu zapewniający mniej lub bardziej bezpośredni dostęp do idei platformy, co oznacza "wątek". threading dostarcza pojęcie wyższego poziomu "wątku" z mniejszą zależnością od platformy.

Dlatego doktorzy mówią różne rzeczy. To, co dzieje się z "wątkiem" niskiego poziomu thread przy wyjściu, zależy od tego, co robią wątki platformy C, ale w każdym razie Python nie próbuje ani nie wyłącza ich w sposób czysty.

A threading.Thread jest inny. Część normalnego procesu zamykania Pythona to .join() wszystkie wątki nie będące demonami threading.Thread. Zatem program nie zakończy się wcale, dopóki nie zakończą się wszystkie wątki nie będące demonami threading.Thread (co jest obowiązkiem programisty w zakresie zapewnienia). Zauważ, że wątki niskiego poziomu thread nie mają koncepcji .join() - .join() to koncepcja wyższego poziomu realizowana przez przez odrębny moduł threading.

Porada: użyj threading zamiast thread, chyba że masz doskonałe powody, aby użyć zamiast tego thread. threading jest lepiej zachowane i dostarcza wielu przydatnych narzędzi. Przykład użycia numeru thread jest lepszy? Nie mogę o tym pomyśleć ;-)

Uwaga: w języku Python 3 moduł niskiego poziomu thread został przemianowany na _thread. Jak zwykle, wiodące podkreślenia podpowiadają "lepiej nie zadzieraj z tym - ale to tutaj, jeśli musisz".

Powiązane problemy