【问题标题】:How can I notify a Celluliod::Actor of mastered Celluloid::Pool actor died?如何通知已掌握的赛璐珞::泳池演员死亡的赛璐珞::演员?
【发布时间】:2015-07-12 15:26:06
【问题描述】:

我有一个测试示例。

这里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: [])

【问题讨论】:

    标签: ruby celluloid


    【解决方案1】:

    这是一个已知问题,正在以下链接中解决:

    要点是:

    trap_exit 已经适用于 Pool 管理器本身。当一个actor死亡时,它需要从Poolidlebusy集合中取出,并且需要以idle生成一个新的actor ...否则Pool变得不稳定。

    需要注入辅助方法才能在Pool 本身可以纠正其与死演员的情况之后运行。

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2012-08-30
      • 1970-01-01
      • 2016-08-07
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多