如何通知Celluliod :: Actor的掌握Celluloid :: Pool演员死了?

时间:2015-07-09 18:07:10

标签: ruby celluloid

我有一个测试示例。

尽管MyBoss的一些工作必须要死,但MyBoss应该努力完成艰苦的工作。

require 'celluloid'
require 'celluloid/autostart'

class MyActor
  include Celluloid

  attr_reader :name, :peace_of_work

  def initialize
    @name = "actor_#{self.object_id}"
    print "Created actor '#{@name}'\n"
  end

  def run(peace_of_work)
    @peace_of_work = peace_of_work
    sleep 0.1
    raise "Actor '#{@name}' is dying" if rand(0..1.0) < 0.1
    print "Actor '#{@name}' has #{peace_of_work}-th peace of work done\n"
  end
end

class MyBoss
  def initialize
  end

  def run work_peaces
    @work_peaces = work_peaces
    @actor_pool = MyActor.pool(size: 10, args: [])
    work_peaces.each do |peace_of_work|
      @actor_pool.async.run(peace_of_work)
    end
  end
end

if __FILE__ == $PROGRAM_NAME
  boss = MyBoss.new
  work_peaces = (0..999).to_a
  boss.run(work_peaces)
  sleep
end

演员零星死亡。我需要重做工作和平。如果他们在游泳池中,我怎么能捕捉演员死亡?请注意MyActor.pool(size: 10, args: [])

1 个答案:

答案 0 :(得分:0)

这是一个已在下面的链接中解决的已知问题:

要点是:

trap_exit已经适用于Pool经理本身。当一个演员去世时,需要将其从idle的{​​{1}}和busy集合中取出,并且需要将新演员生成为Pool ...否则idle变得不稳定。

需要注入一个辅助方法,以便在Pool本身可以使用死角色来纠正其情况之后运行。