2011-09-20 2 views
0

이것이 바보 같은 질문 인 경우 용서해주십시오. 나는 실을 꿰기에 아주 새롭다. 나는 종종 가입 전에 잠시 기다려야 할,항상 실행중인 스레드에 파이썬으로 참여하십시오

class mem_mon(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.keeprunning = True 
     self.maxmem = 0 
    def run(self): 
     while self.keeprunning: 
      self.maxmem = max(self.maxmem, ck_mem()) 
      time.sleep(10) 

그러나 때문에 sleep 호출 : 나는 완료됩니다 스레드를 실행하고 나는 keeprunning 상태 지금처럼 변경할 때. keeprunning을 더 자주 확인하는 더 빠른 루프를 만드는 것 외에는 스레드에 즉시 참여할 수있는 방법이 있습니까? 예를 들어 __del__ 또는 join을 재정의하면?

+2

'threading.Event' 또는'threading.Condition' 객체를 사용하십시오. – wberry

+0

고마워요. 그게 내가 말하려고하는 것인데, 그것에 대한 별도의 수업이 있다는 것을 기억하지 못했습니다. – lunixbochs

답변

3

threading.Event을 time.sleep()으로 사용하면 방해를받을 수 있습니다. 내가 생각할 수있는

class mem_mon(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.keeprunning = True 
     self.maxmem = 0 
     self.interrupt = threading.Event() 

    def run(self): 
     # this loop will run until you call set() on the interrupt 
     while not self.interrupt.isSet(): 
      self.maxmem = max(self.maxmem, ck_mem()) 

      # this will either sleep for 10 seconds (for the timeout) 
      # or it will be interrupted by the interrupt being set 
      self.interrupt.wait(10) 

mem = mem_mon() 
mem.run() 

# later, set the interrupt to both halt the 10-second sleep and end the loop 
mem.interrupt.set() 
0

가장 간단한 솔루션뿐만 아니라 추한입니다 - 내가 한 번이 조리법에, 파이썬의 모든 스레드를 죽일 방법을 살펴 보았다 : - 나는 필요에 따라 잠금 및 대기열을 사용하여, 그것을 사용하지,하지만 http://icodesnip.com/snippet/python/timeout-for-nearly-any-callable 가능성은 거기에있다.

+0

뮤텍스 이벤트가 정확히 같은 양의 코드를 수행 할 수있는 경우 추악한 솔루션이 필요하지 않습니다. – lunixbochs

+0

물론 맞습니다. 그런 솔루션이 있음을 알았습니다. 한 가지 예를 들자면 레거시 코드로 작업 할 때 사용하는 부분을 생각해 볼 수 있습니다. 일부 스레드를 부분적으로 다시 작성하는 것보다 쉽습니다. 그러나 내가 말했듯이 결코 그것을 사용하지 않았고 언제 또는 내가 할 것인지 모른다. 그것은 단지 IMHO를 알 가치가있는 무엇인가 궁금합니다. – cji

+0

링크가 끊어졌습니다. – preezzzy

관련 문제