2014-04-30 11 views
0

Celluloid에있는 간단한 프로그램을 구현하고 있으며, 각 프로그램은 결과를 집계하는 주체에게 결과를 전송합니다.SupervisionGroup을 종료하려면 어떻게해야합니까?

this FAQ에 따라,이 같은 SupervisionGroup를 소개 :

module Shuffling   
    class AggregatorActor 
    include Celluloid  

    def initialize(shufflers) 
     @shufflerset = shufflers 
     @results = {}   
    end 

    def add_result(result) 
     @results.merge! result 

     @shufflerset = @shufflerset - result.keys 

     if @shufflerset.empty? 
     self.output 
     self.terminate 
     end 
    end 

    def output 
     puts @results 
    end 
    end 

    class EvalActor 
    include Celluloid 

    def initialize(shufflerClass) 
     @shuffler = shufflerClass.new 
     self.async.runEvaluation 
    end 

    def runEvaluation 
     # computation here, which yields result 
     Celluloid::Actor[:aggregator].async.add_result(result) 
     self.terminate 
    end 
    end 

    class ShufflerSupervisionGroup < Celluloid::SupervisionGroup 
    shufflers = [RubyShuffler, PileShuffle, VariablePileShuffle, VariablePileShuffleHuman].to_set 

    supervise AggregatorActor, as: :aggregator, args: [shufflers.map { |sh| sh.new.name }] 

    shufflers.each do |shuffler| 
     supervise EvalActor, as: shuffler.name.to_sym, args: [shuffler] 
    end 
    end 

    ShufflerSupervisionGroup.run 
end 

그들이 완료 후 나는 EvalActor의를 종료하고, 노동자의 모든 작업이 완료 될 때 나는 또한 AggregatorActor을 종료합니다.

그러나 감독 스레드는 활성 상태를 유지하고 주 스레드를 활성 상태로 유지합니다. 프로그램이 종료되지 않습니다.

그룹에 .run!을 보내면 기본 스레드가 종료되고 아무 것도 작동하지 않습니다.

AggregatorActor 종료 후 그룹을 종결하기 위해 무엇을 할 수 있습니까 (또는 그룹 용어로는 finalize). (나는 실패 배우의 예을 다시 실행을 감독을 필요로하지 않았기 때문에)

class AggregatorActor 
    include Celluloid 

    def initialize(shufflers) 
    @shufflerset = shufflers 
    @results = {} 
    end 

    def wait_for_results 
    sleep 5 while not @shufflerset.empty? 

    self.output 
    self.terminate 
    end 

    def add_result(result) 
    @results.merge! result 

    @shufflerset = @shufflerset - result.keys 

    puts "Results for #{result.keys.inspect} recorded, remaining: #{@shufflerset.inspect}" 
    end 

    def output 
    puts @results 
    end 
end 

그리고 나는 SupervisionGroup 제거있어 :

답변

0

내가 결국 무슨 짓을하는 wait_for_results을 위해 AggregatorActor을 변경할 수있다 나는 이것을 다음과 같이 사용했습니다 :

shufflers = [RubyShuffler, PileShuffle, VariablePileShuffle, VariablePileShuffleHuman, RiffleShuffle].to_set 

Celluloid::Actor[:aggregator] = AggregatorActor.new(shufflers.map { |sh| sh.new.name }) 

shufflers.each do |shuffler| 
    Celluloid::Actor[shuffler.name.to_sym] = EvalActor.new shuffler 
end 

Celluloid::Actor[:aggregator].wait_for_results 

깨끗하게 느껴지지 않습니다. 깨끗한 방법이 있다면 좋을 것입니다. 그러나 적어도이 방법이 효과적입니다.