我在赛璐珞中实现了一个简单的程序,理想情况下它将并行运行几个演员,每个演员都会计算一些东西,然后将其结果发送回主要演员,其工作只是汇总结果。
在这个 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
在他们完成后终止 s,AggregatorActor
当所有工作人员都完成后我也终止。
但是,监督线程保持活动状态并使主线程保持活动状态。程序永远不会终止。
如果我发送.run!
到该组,那么主线程会在它之后立即终止,并且没有任何作用。
终止后,我可以做些什么来终止组(或者,用组术语,finalize
我想)AggregatorActor
?