2014-10-14 5 views
0
나는 다음과 같은 상황에서 중지하고 루비의 특정 스레드를 실행할 수 있도록하려면

: 메시지를 수신 서버 역할 위의 인간의 언어 스크립트에서루비 멀티 스레딩 - 중지하고 특정 스레드를 다시 시작

thread_hash = Hash.new() 
loop do 
    Thread.start(call.function) do |execute| 
    operation = execute.extract(some_value_from_incoming_message) 
    if thread_hash.has_key? operation 
     thread_hash[operation].run 
    elsif !thread_hash.has_key? 
     thread_hash[operation] = Thread.current 
     do_something_else_1 
     Thread.stop 
     do_something_else_2 
     Thread.stop 
     do_something_else_3 
     thread_hash.delete(operation) 
    else 
     exit 
    end 
    end 
end 

, 들어오는 메시지에서 일부 매개 변수를 추출합니다. 해당 매개 변수가 이미 thread_hash에 있으면 일시 중단 된 스레드를 다시 시작해야합니다.

매개 변수가 thread_hash에 없으면 스레드 ID와 함께 매개 변수가 thread_hash에 저장되고 일부 함수가 실행되고 현재 스레드는 새 루프에서 다시 시작될 때까지 일시 중단되며 do_something_else_3 함수가 실행되고 작업 서비스가 완료 될 때까지 일시 중단됩니다 현재 스레드에서 해시에서 제거됩니다.

thr.run 

가인가 :

는 스레드 ID 또는 새 스레드가

thr = Thread.start 

처럼 시작할 때 이름을 부여해야하며, 같은이 이름 만 다시 시작할 수 있습니다에 따라 루비에 재개 된 스레드 수 솔루션은 위에서 설명한 현실? 새로운 스레드에서 이전 스레드 재개로 인해 누출/교착 상태가 발생하거나 중복 스레드가 자동으로 루비에서 처리됩니다.

답변

0

모든 스레드에서 모든 것을하려고하는 것처럼 나에게 들린다. 입력 읽기, 기존 스레드 실행, 새 스레드 저장, 오래된 스레드 삭제. 왜 문제를 해결하지 않겠습니까?

hash = {} 

loop do 
    operation = get_value_from message 

    if hash[operation] and hash[operation].alive? 
    hash[operation].wakeup 
    else 
    hash[operation] = Thread.new do 
     do_something1 
     Thread.stop 
     do_something2 
     Thread.stop 
     do_something3 
    end 
    end 
end 

루프의 전체 내용을 스레드로 래핑하는 대신 메시지 처리 코드 만 스레드하십시오. 이렇게하면 루프가 메시지를 기다리는 동안 백그라운드로 돌아갈 수 있습니다. 이것은 모든 스레드 관리가 주 스레드에서 발생하기 때문에 모든 종류의 인종/교착 상태 문제를 해결합니다.

+0

좋은 점, 힌트에 감사드립니다! –

관련 문제