2013-08-07 3 views
9

Wir von diesem Fehler betroffen waren:Detect Interpreter geschlossen in Dämon-Thread nach unten

http://bugs.python.org/issue1856 Daemon-Threads segfault während Interpreter herunterzufahren.

Jetzt suche ich einen Weg, um diesen Fehler zu programmieren.

Im Moment sieht der Code wie folgt:

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

Gibt es eine Möglichkeit zu überprüfen, ob der Dolmetscher noch verwendbar ist, bevor do_something()?

Oder ist es besser, mythread.setDaemon (True) nicht zu machen und zu überprüfen, ob der Haupt-Thread beendet wurde?

+1

im Zusammenhang: http://StackOverflow.com/Questions/16731115/How-To-Debug-Apython-Seg-Fault – guettli

Antwort

5

Antwort auf ihre Frage:

ich dieses Muster jetzt verwenden: nicht setDaemon (True), verwenden Sie nicht schlafen(), verwendet parent_thread.join()

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

ähnliche Werke: http://docs.python.org/2/library/threading.html#threading.Thread.join

+0

Ich verstehe es nicht. Wenn ein untergeordneter Thread kein Daemon ist, dann stirbt ein übergeordneter Thread niemals (vor Kind) und somit ist "is_alive" auf Eltern immer wahr. I.e. Dieser ganze Check ist sinnlos. Es könnte funktionieren, wenn ein untergeordneter Thread ein Daemon ist. – freakish

+1

@freakish, wenn der übergeordnete (Haupt-) Thread sein Ende erreicht hat, gibt is_alive() False zurück, aber der untergeordnete Thread ist noch am Leben. Es funktioniert in meinen Tests. – guettli

+0

Interessant. Ich habe es getestet und du hast recht: es funktioniert. – freakish

0

Dies ist ein Code aus threading.py Modul:

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 

könnte hilfreich sein. Der Fehler, den Sie sehen, kommt von else Aussage. Also in Ihrem Fall:

import sys as _sys 

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

Ich bin nicht sicher, ob es funktioniert, obwohl (beachten Sie, dass Dolmetscher Shutdown innerhalb do_something passieren kann, so sollten Sie wahrscheinlich alles mit try:except: wickeln).

Daemon-Threads sind nicht unbedingt schlecht, sie können definitiv den Entwicklungsprozess beschleunigen. Sie müssen nur vorsichtig mit ihnen sein.