2017-12-20 22 views
1

threading.Thread 클래스를 고려컨텍스트 관리자에서 스레드를 사용하는 방법은 무엇입니까?

class Sleeper(threading.Thread): 
    def __init__(self, sleep=5.0): 
     threading.Thread.__init__(self) 
     self.event = threading.Event() 
     self.sleep = sleep 

    def run(self): 
     while self.sleep > 0 and not self.event.is_set(): 
      self.event.wait(1.0) 
      self.sleep -= 1 

    def stop(self): 
     self.event.set() 

그것은 시간과 종료의 일정 시간 동안 잠 또는 그 금액에 도달하기 전에 중지됩니다.

나는로 사용 :

sleeper = Sleeper() 
try: 
    sleeper.start() 
    # do stuffs here 
except: 
    # handle possible exceptions here 
finally: 
    sleeper.stop() 

그리고 나는 차라리 컨텍스트 매니저처럼 사용합니다 :

with Sleeper(): 
    # do stuffs here 

을하고 with 블록을 종료 할 때 다음 스레드가 중지됩니다.

내가 __enter____exit__ 방법을 추가하는 시도하고 작동하는 것 같다하지만 난이 길을 가야하는 것입니다 확실하지 않다 :

def __enter__(self): 
    self.start() 
    return self 

def __exit__(self, type, value, traceback): 
    self.stop() 

하지만 난 정말이야 내가 여기서 뭘하고 있는지 모르겠다. 어떻게 제대로 수행되어야합니까?

+0

정확히 무엇입니까? 당신은 당신이하려는 일을위한 해결책을 가지고있는 것 같습니다. –

+0

내 솔루션은 내가 시도하고있는 코드 일뿐입니다. 문제는 이것이 어떻게 제대로 이루어져야 하는가입니다. – Bastian

+0

슬리퍼 클래스의 요점은 무엇입니까? 당신은 무엇을 위해 자고 있으며, 왜 그것을하기 위해 별도의 실이 필요합니까? –

답변

0

aws 관련 문제의 배경 부족으로 인해 질문을 이해하지는 못하더라도. 앞서 언급 한 것처럼 컨텍스트를 사용하여이 작업을 수행 할 수 있습니다.

import threading 
import time 


class Sleeper(threading.Thread): 
    def __init__(self, sleep=5.0): 
     threading.Thread.__init__(self, name='Sleeper') 
     self.stop_event = threading.Event() 
     self.sleep = sleep 

    def run(self): 
     print('Thread {thread} started'.format(thread=threading.current_thread())) 
     while self.sleep > 0 and not self.stop_event.is_set(): 
      time.sleep(1.0) 
      self.sleep -= 1 
     print('Thread {thread} ended'.format(thread=threading.current_thread())) 

    def stop(self): 
     self.stop_event.set() 

    def __enter__(self): 
     self.start() 
     return self 

    def __exit__(self, *args, **kwargs): 
     self.stop() 
     print('Force set Thread Sleeper stop_event') 


with Sleeper(sleep=2.0) as sleeper: 
    time.sleep(5) 

print('Main Thread ends') 

다음과 같은 두 가지 경우를 테스트 할 수 있습니다. 1. 메인 수면 시간이 더 길어졌습니다. 2. 슬리퍼 스레드가 더 큰 수면 매개 변수를 가지면 두 결과가 종료됩니다.

with Sleeper(sleep=2.0) as sleeper: 
    cnt = 15 

    while cnt > 0 and sleeper.is_alive(): 
     print(cnt) 
     cnt -= 1 
     time.sleep(1) 

그리고 당신은 주요 단지 인해 침대에, 몇 수를 인쇄를 참조 끝이 할 수

여전히 주, 코드와 슬리퍼 스레드와 상호 작용하려는 경우가해야 다음과 같습니다 더 이상 살아 있지 않습니다.