2013-08-07 1 views
9

にシャットダウン検出:インタプリタがシャットダウン時には、インタプリタは私たちがこのバグに見舞われたデーモン・スレッド

http://bugs.python.org/issue1856デーモンスレッドがセグメンテーションフォールト。

ここで、このバグを回避する方法を検索します。

現時点でのコードは次のようになります。

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

は、インタプリタが()をdo_something前に、まだ使用可能であるかどうかを確認する方法はありますか?

また、mythread.setDaemon(True)とメインスレッドが終了したかどうかを確認しない方が良いですか?

+1

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

答えて

5

回答:

私は今、このパターンを使用します。は、setdaemonません(真)、(睡眠を使用していない)、使用parent_thread.join()

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

関連: http://docs.python.org/2/library/threading.html#threading.Thread.join

+0

私はそれを取得しません。子スレッドがデーモンでない場合、親スレッドは(子の前に)死ぬことはないので、親の 'is_alive'は常に真です。私。この全体の小切手は無意味です。子スレッドがデーモンであれば動作するかもしれません。 – freakish

+1

@freakish親(メイン)スレッドが最後に達した場合、is_alive()はFalseを返しますが、子スレッドはまだ生きています。それは私のテストで動作します。 – guettli

+0

興味深い。私はそれを試して、あなたは正しい:それは動作します。 – freakish

0

これはthreading.pyモジュールからのコードです:

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 

は役に立つかもしれません。表示されるエラーは、elseステートメントから得られます。だからあなたの場合:

import sys as _sys 

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

私はそれは(あなたがおそらくtry:except:で、すべてを包むべきでdo_somethingの内側に発生する可能性があり、そのインタプリタのシャットダウンに注意してください)しかし動作するかどうかはわかりません。

デーモンスレッドは必ずしも悪いわけではありませんが、開発プロセスをスピードアップすることは間違いありません。あなたはちょうどそれらに注意する必要があります。自分の質問への

関連する問題