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
제거있어 :