2011-10-26 7 views
4

일정한 시간이 지나면 끝내지 않으면 죽게 만드는 스레드를 원합니다. 이것을 할 수있는 우아하고 관용적 인 방법이 있습니까? 지금은 감시자 스레드를 만들 생각입니다 :일정 시간이 지난 후에 어떻게 루비 스레드를 죽일 수 있습니까?

def myfunc 
    t = Thread.new{ 
    #do stuff 
    } 

    # watcher thread 
    Thread.new{ 
    result = t.join(20) # join returns nil if it timed out 
    t.kill if result.nil? 
    } 

    # continue on asynchronously from both threads 
end 

답변

6

아마도 Timeout 클래스가 필요합니다.

def myfunc 
    Thread.new{ 
    Timeout::timeout(20) { 
     #do stuff 
    } 
    } 

    # continue on asynchronously 
end 
+0

아하! 내가 문제를 해결하기 위해 그것을 사용하는 방법의 예를 포함하여 답변을 편집 ... –

+1

나는 스레드 내에서 Timeout 객체를 래핑 할 필요가 없다고 생각합니다. Timeout은 코드 블록에 대한 스레드를 생성하므로 모든 것을 비동기로 만들지 않는 한 그러지 않아도됩니다. – Miguel

+0

네, 비동기 적이기를 바랍니다. 요점이 있습니다. 스레드가 멈 추면 스레드 자체를 지우고 싶습니다. –

3

나는 대부분의 상황에서, 당신은 스레드 프로그램 논리에 의해 스레드의 "생명"을 제어해야합니다 생각합니다.

스레드가 실제로는 무한 루프라는 가정하에 일반 while (true) 대신 인스턴스 변수 (예 : is_running)가 있고 while (is_running)과 같은 루프가 될 수 있습니다. 다른 스레드가이 스레드를 중지하려면 단순히 (직접 또는 간접적으로) is_running을 false로 만들 수 있습니다. 작업 스레드는 마지막 작업을 완료하고 루프를 완료 할 수 있습니다.

+0

참. 그러나이 경우 너무 오래 걸리면 절대적으로 죽이고 싶습니다. –

관련 문제