Как я могу сообщить Celluliod:: Актер освоенного Celluloid::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: [])
1 ответ
Решение
Это известная проблема, решаемая по ссылке ниже:
Суть это:
trap_exit
уже работает на Pool
Сам менеджер. Когда актер умирает, его нужно вынуть из idle
а также busy
наборы Pool
и новый актер должен быть создан как idle
... в противном случае Pool
становится нестабильным
Вторичный метод должен быть введен для запуска после Pool
Сам может исправить свою ситуацию с мертвым актером.