2013-08-07 7 views
9

siamo stati colpiti da questo bug:Rileva Interprete chiuso nel thread demone

http://bugs.python.org/issue1856 discussioni Daemon segfault durante interprete chiuso.

Ora cerco un modo per codificare questo bug.

Al momento il code looks like questo:

while True: 
    do_something() 
    time.sleep(interval) 

È Esiste un modo per check se l'interpreter è still usable before do_something()?

O è meglio non eseguire mythread.setDaemon (True) e controllare se il thread principale è uscito?

+1

correlati: http://stackoverflow.com/questions/16731115/how-to-debug-a-python-seg-fault – guettli

risposta

5

risposta alla stessa domanda:

Io uso questo modello ora: non fare setDaemon (True), non usare sleep(), l'uso parent_thread.join()

while True: 
    parent_thread.join(interval) 
    if not parent_thread.is_alive(): 
     break 
    do_something() 

correlati:

+0

Non capisco. Se un thread secondario non è daemon, un thread padre non morirà mai (prima di child) e quindi 'is_alive' su parent sarà sempre true. Cioè questo intero controllo è inutile. Potrebbe funzionare se un thread figlio è daemon però. – freakish

+1

@freakish se il thread principale (principale) ha raggiunto la fine, is_alive() restituirà False, ma il thread figlio è ancora attivo. Funziona nei miei test. – guettli

+0

Interessante. L'ho provato e hai ragione: funziona. – freakish

0

Si tratta di un codice da threading.py modulo:

import sys as _sys 

class Thread(_Verbose): 
    def _bootstrap_inner(self): 
     # some code 

      # If sys.stderr is no more (most likely from interpreter 
      # shutdown) use self._stderr. Otherwise still use sys (as in 
      # _sys) in case sys.stderr was redefined since the creation of 
      # self. 
      if _sys: 
       _sys.stderr.write("Exception in thread %s:\n%s\n" % 
        (self.name, _format_exc())) 
      else: 
       # some code 

potrebbe essere utile. L'errore che vedi proviene dall'istruzione else. Quindi nel tuo caso:

import sys as _sys 

while True: 
    if not _sys: 
     break/return/die/whatever 
    do_something() 
    time.sleep(interval) 

non sono sicuro se funziona anche se (nota che l'arresto interprete può accadere all'interno do_something in modo probabilmente si dovrebbe avvolgere il tutto con try:except:).

I thread di daemon non sono necessariamente negativi, possono sicuramente accelerare il processo di sviluppo. Devi solo stare attento con loro.