2013-10-06 6 views
10

Dalla documentazione: http://docs.python.org/2/library/threadCosa succede agli altri thread quando il thread principale chiama sys.exit()?

Quando termina il thread principale, che dipende dal sistema altri fili sopravvivere. Su SGI IRIX che utilizza l'implementazione del thread nativo, sopravvive. Sulla maggior parte degli altri sistemi, vengono uccisi senza eseguire provare ... infine le clausole o l'esecuzione di oggetti distruttori.

E qui, nella documentazione (http://docs.python.org/2/library/threading) si dice:

un thread può essere segnalato come un “filo daemon”. Il significato di questo flag è che l'intero programma Python termina quando rimangono solo i thread daemon . Il valore iniziale è ereditato dal thread di creazione.

Parliamo solo di thread non daemon qui. Dato che la prima citazione non fa alcun riferimento speciale ai thread non-demone, suppongo che anche i thread non daemon dovrebbero essere uccisi se il thread principale sta per uscire. Tuttavia, la seconda citazione suggerisce il contrario. E infatti, i thread non daemon non vengono effettivamente uccisi quando il thread principale termina. Quindi, qual è il punto della prima citazione qui?

+0

Scrivere codice e provarlo –

+2

Sembra che il modulo 'thread' gestisca tutto come thread daemon, mentre' threading' aggiunge il concetto di thread "non daemon". –

+0

@ user2799617: Ho scritto codice e sono giunto alla conclusione "i thread non daemon non vengono effettivamente uccisi quando il thread principale termina".Ecco perché, mi chiedo quando si applica la prima citazione poiché il mio sistema è probabilmente uno di quei "molti altri sistemi": Ubuntu 12.10 che esegue python 2.7 – gjain

risposta

8

La documentazione di riferimento proviene da due diversi moduli: thread e threading. thread è un modulo di basso livello che fornisce più o meno accesso diretto all'idea della piattaforma di cosa significhi "filo". threading fornisce una nozione di "thread" di livello superiore con meno dipendenza dalla piattaforma.

Ecco perché i documenti dicono cose diverse. Quello che succede a un "thread" di basso livello thread all'uscita dipende da cosa fa la versione dei thread della piattaforma C, ma in ogni caso Python non fa alcun tentativo di - o di non - spegnerli in modo pulito.

A threading.Thread è diverso. Parte dell'elaborazione normale di spegnimento di Python è a .join() tutti i thread non-daemon threading.Thread. Quindi il programma non finirà affatto fino a quando tutti i thread non-daemon threading.Thread terminano (che è responsabilità del programmatore assicurarsi). Si noti che i thread di livello basso thread non hanno il concetto di .join() - .join() è un concetto di livello superiore implementato da il modulo distinto threading.

Avviso: utilizzare threading anziché thread a meno che non si abbiano motivi eccellenti per utilizzare thread invece. threading si comporta meglio e fornisce molti strumenti utili. Un esempio di quando si usa thread è meglio? Non riesco a pensare a uno ;-)

Nota: in Python 3, il modulo di livello basso thread viene rinominato in _thread. Come al solito, la sottolineatura principale suggerisce "meglio non scherzare con questo - ma è qui se è necessario".