2017-11-18 1 views
0

문제가 생겼을 때 스레드를 중지하는 데 문제가 있습니다. 모두가 계획대로 실행되면 run()이 끝나면 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

다른 파이썬 스레드에서 파이썬 스레드를 죽일 수 없습니다. 또한, 같은 프로세스에있는 다른 파이썬 스레드를 죽이려고하면, 결국 스스로 죽게 될 수도 있습니다. 스레드가 설정 한 일부 메시지 채널을 통해서만 스레드를 요청할 수 있습니다.

예를 들어, 당신은 통과 고려할 수있는 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

확인 .. 짧은 backgroundstory : 나는 ~ 6K 파일을 가지고 가상 머신에 그들과 함께 작업해야하고 난 스레딩이 좋은 것이라고 생각 생각. 그러나 나는 그들을 안정적으로 멈출 수 없다면 나는 수백 개의 실행 스레드로 끝나게된다 ... 모든 스크립트가 끝날 때까지 스크립트는 자동으로 며칠 씩 실행되어야한다. 너 스레딩은 내 경우에 좋거나 나쁘지 않니? – Mugen

+0

GIL에 대해 알고 있습니까? 파이썬에서는 오직 하나의 코어 만 가져옵니다. 더 많은 것을 원하면, 다중 처리를 사용하십시오. – xaav

+0

답변과 도움에 감사드립니다. 이것은 내가 파이썬과 처음으로 쓰레딩을 할 때 처음이다. 그래서 나는 내 코드에 가장 적합한 것이 무엇인지 모른다. 스레딩에서 쓰레드보다 멀티 프로세스에서 프로세스를 안정적으로 중단하는 것이 더 쉬운가? 그렇다면 그것을 구현하려고합니다. – Mugen

관련 문제