2017-11-18 9 views
0

何か問題が発生したときにスレッドを停止するのに問題があります。すべてが計画どおりに実行されていれば、stop_thread()関数でスレッドを停止できますが、とにかく、自動的に停止することはほとんどありません。は失敗したスレッドを停止できません

class sample_thread: 

def __init__(self): 
    self._running = True 

def stop(self): 
    self._running = False 


def run(): 
    try: 
     do something 
    except: 
     do something 
     self._running = False 
    finally: 
     do something 
     self._running = False 

これは私のスレッドクラスです。 2つのスレッド(メインを除く)の実行時間が最も長く、終了していない場合は、一定時間後に停止します。

def stop_thread(p): 
print(time.time()-p['start']) 
if time.time() - p['start'] > 240: 
    try: 
     p['thread_name'].stop() 
     do something more 
     p['thread_instance'].join(10) 
     if p['thread_instance'].is_alive(): 
      print('[-] Thread should be dead, but is still alive. Try again later') 
      p['thread_name'].stop() 
      p['thread_instance'].join(10) 
      return False 
     else: 
      print('[+] Failed thread successful stopped') 
     return True 
    except: 
     print('[-] Error occured in stop_thread') 

'p'は、スレッド(開始時刻、名前、インスタンスなど)に関するいくつかの情報を含むdictです。 私の問題は基本的に、予期せぬ事態が発生し、コードがif節に入ると、スレッドをもう止められなくなったということです。どれくらい頻繁にFalseを返し、stop_thread関数を実行します。 どのようなアイデアが私のコードに間違っていますか、それを修正してスレッドを確実に消滅させる方法はありますか? 私はすべての助けがうれしいです! ありがとうございました

答えて

0

別のPythonスレッドからPythonスレッドを削除することはできません。さらに、同じプロセス内にある別のPythonスレッドを殺そうとすると、あなた自身が死ぬかもしれません。スレッドは、設定したメッセージチャネルを介して停止するようにのみ要求できます。

はたとえば、あなたが渡す検討するかもしれないqueueスレッドへ:

class SampleThread(): 
    def __init__(self, q): 
     self.q = q 

    def run(self): 
     while True: 
      do_some_work() 
      if not self.q.empty(): 
       return 
+0

OK ...短いbackgroundstory:私は〜6Kのファイルを持っており、VMS上でそれらを使用する必要があると私はスレッドが良いだろうと思いましたアイディア。しかし、私はそれらを止めることができない場合は、私はいくつかの実行中のスレッドで終わる信頼性の高い...スクリプトは自動的に数日、すべてのファイルが終了するまで実行する必要があります。私の場合、スレッディングは良いか悪いのですか? – Mugen

+0

あなたはGILを知っていますか? Pythonでは、1つのコアしか得られません。もっと必要な場合は、マルチプロセッシングを使用してください。 – xaav

+0

あなたの答えと助けてくれてありがとう。これは、私がPythonで作業して初めて、またスレッディングではじめてです。だから、私のコードには何が最善であるかという手がかりはありません。スレッディングのスレッドよりも、マルチプロセスのプロセスを確実に停止させる方が簡単ですか?もしそうなら、私はそれを実装しようとします。 – Mugen

関連する問題