我如何通知 Celluliod::Actor 已掌握 Celluloid::Pool 的演员死亡?
How can I notify a Celluliod::Actor of mastered Celluloid::Pool actor died?
我得到了一个测试示例。
在这里 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: [])
这是一个已知问题,正在下面的 link 中解决:
要点是:
trap_exit
已经为 Pool
经理本身工作。当一个 actor 死亡时,需要将其从 Pool
的 idle
和 busy
集合中取出,并且需要生成一个新的 actor 作为 idle
... 否则Pool
变得不稳定。
在 Pool
本身可以纠正其死演员的情况后,需要将辅助方法注入 运行。
我得到了一个测试示例。
在这里 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: [])
这是一个已知问题,正在下面的 link 中解决:
要点是:
trap_exit
已经为 Pool
经理本身工作。当一个 actor 死亡时,需要将其从 Pool
的 idle
和 busy
集合中取出,并且需要生成一个新的 actor 作为 idle
... 否则Pool
变得不稳定。
在 Pool
本身可以纠正其死演员的情况后,需要将辅助方法注入 运行。