Betekenis van daemon-eigenschap op Python-threads

Ik ben een beetje in de war over wat het betekent om een ​​thread als daemon in te stellen.

De documentatie zegt dit:

Een discussielijn kan worden gemarkeerd als een ‘daemon’
draad”. De betekenis van deze vlag
is dat het hele Python-programma
wordt afgesloten wanneer alleen daemon-threads zijn
links. De beginwaarde wordt geërfd
uit de maakdraad. De vlag kan
worden ingesteld via de daemon-eigenschap.

Ik weet niet zeker wat dit anders maakt dan een normale thread.

Betekent dit dat dit programma nooit zal eindigen?

def threadfunc():
    while True:
        time.sleep(1)
threading.Thread(target=threadfunc).start()

Ook al voltooit de hoofdthread zijn uitvoering. Terwijl zal onmiddellijk eindigen?

def threadfunc():
    while True:
        time.sleep(1)
th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()

Ik vraag het omdat ik een situatie heb waarin ik in mijn hoofdthread sys.exit() aanroep, en het proces blijft gewoon hangen en mijn andere threads worden uitgevoerd zoals ik het logboek kan zien.

Heeft dit iets te maken met het feit dat sys.exit() wordt aangeroepen met actieve threads?


Antwoord 1, autoriteit 100%

Betekent dit dat dit programma nooit zal eindigen?

Ja, dat programma zal niet eindigen, probeer het gewoon.

Ik vraag het omdat ik een situatie heb waarin
in mijn hoofdthread bel ik
sys.exit(), en het proces loopt gewoon vast
en mijn andere threads lopen als ik
kan het logboek zien. Heeft dit?
alles wat met sys.exit() te maken heeft
gebeld met threads in leven?

Ja, zelfs exitzal andere threads niet stoppen, het verhoogt gewoon SystemExitin de hoofdthread. Dus terwijl de hoofdthread stopt (net als bij elke andere onverwerkte uitzondering), blijven alle andere niet-daemonische threads werken.


Antwoord 2, autoriteit 36%

Door thread.daemon = Truein te stellen, kan het hoofdprogramma worden afgesloten. Apps wachten normaal tot alle onderliggende threads zijn voltooid voordat ze worden voltooid.


Antwoord 3, autoriteit 14%

th.daemon = True #set this thread as a Daemon Thread

Je kunt in een Daemon-thread als een service denken dat dit betekent dat het op de achtergrond van je computer wordt uitgevoerd en verschillende taken uitvoert, zoals het indexeren van bestanden, het ontleden van XML, het ophalen van nieuws enz., alles wat een langdurig proces is.

Je hoofdthread zal eindigen en je daemon zal nog steeds op de achtergrond draaien, dat is de reden waarom je programma, ook wel Main thread genoemd, eindigt, als je gewoon een oneindige lus wilt plaatsen en je zult zien dat je thread nog steeds loopt.
Een voorbeeld voor een daemon-thread is de garbagecollection.

Other episodes