Registry :
通过 Registry 我们可以将 actor 登记注册,随后我们就可以使用符号进行引用,使用方法如下:
-
>> james = JamesDean.new
-
=> #<Celluloid::Actor(JamesDean:0x80c27ce0)>
-
>> Celluloid::Actor[:james] = james
-
=> #<Celluloid::Actor(JamesDean:0x80c27ce0)>
-
>> Celluloid::Actor[:james]
-
=> #<Celluloid::Actor(JamesDean:0x80c27ce0)>
Celluloid::Actor 会构建一个 hash,允许你用自己指定的名字保存和引用 actor 。或许有人会问,为什么使用 Registry ,我使用 普通变量保存 actor 一样可以啊。如果你只是使用普通变量保存 actor ,当这个 actor crash 掉的时候,你所引用的将是一个失效的 actor,即便 actor 重启,引用已经变化了,你的程序会出问题。而使用 Registry ,通过符号引用,actor 重启后,你就可以正常使用它了。
一旦我们注册了一个 actor ,我们就可以通过 Celluloid::Actor.name 来访问它,这种方式比访问 hash 的方式要舒服些。很明显这里用到了一些元编程的技巧。另外如果class 中 include Celluloid ,那么在在该类当中我们不需要使用完整的 Celluloid::Acotr.[] 方式,我们可以直接 Actor.[] 来引用。
Registry 的主要用途就是我们可以使用 supervisor 来重启 crashed 的 actor。
Supervisors :
大家可能对 Monk 或 God 比较熟悉,这些模块可以用于监控其他程序的运行,如果应用 crash 掉了可以进行重启。Celluloid 中的 supervisors 也是类似的东西,它是用于监控每个 actor 的运行,如果 crashed 可以重启。(当 actor 中出现未处理的异常时就会当掉)
基本用法,使用 supervise 方法取代 new 方法即可。
-
>> supervisor = Sheen.supervise "Charlie Sheen"
-
=> #<Celluloid::Supervisor(Sheen) "Charlie Sheen">
以上代码将创建一个 Celluloid::Supervisor actor,当然也会创建一个 Sheen actor 。new 方法返回的是新创建的实例对象,supervise 返回的是 supervisor。使用 Celluloid::Supervisor#actors 方法可以获取当前有哪些 actors:
-
>> supervisor = Sheen.supervise "Charlie Sheen"
-
=> #<Celluloid::Supervisor(Sheen) "Charlie Sheen">
-
>> charlie = supervisor.actors.first
-
=> #<Celluloid::Actor(Sheen:0x00000100a312d0)>
如果要创建 Sheen 的同时将其放入 Registry 中,可以使用 supervise_as 方法:
-
>> Sheen.supervise_as :charlie, "Charlie Sheen"
-
=> #<Celluloid::Supervisor(Sheen) "Charlie Sheen">
-
>> charlie = Celluloid::Actor[:charlie]
-
=> #<Celluloid::Actor(Sheen:0x00000100a312d0)>
Supervision Groups :
Supervision Groups 是用来声明管理一批 actor 的。通过它你可以一次性的批量启停一组 actors,并在程序 crash 的时候自动重启。一个 groups 也可 supervise(监控)其他 groups ,这样你就可以构建一个树状的监控体系,将系统的所有部件纳入监控( 包括supervisors 本身)。
从 Celluloid::SupervisionGroup 派生子类,可以构建监控组:
-
class MyGroup < Celluloid::SupervisionGroup
-
supervise MyActor, as: :my_actor
-
supervise AnotherActor, as: :another_actor, args: [{start_working_right_now: true}]
-
pool MyWorker, as: :my_worker_pool, size: 5
-
end
这个 group 启动时,将自动加载 MyActor 和 AnotherActor 并注册别名。还会启动一个包含5个 MyWorker 的 pool。
args: 用于将其后的参数传递给 AnotherAcotr.new 方法,这个参数只能是数组,等效代码:
AnotherActor.new(start_working_right_now: true)
前台启动这个组:MyGroup.run
后台启动这个组:MyGroup.run!
-
class Person
-
include Celluloid
-
-
def initialize(age, height, weight)
-
p(age: age, height: height, weight: weight)
-
end
-
-
def bar
-
rand(20)
-
end
-
end
-
-
supervisor = Celluloid::SupervisionGroup.
-
-
supervisor.pool(Person, as: :people, args: [1,2,3], size: 3)
-
-
p Celluloid::Actor.all.size
-
-
10.times do
-
p supervisor[:people].bar
-
end
阅读(1531) | 评论(0) | 转发(0) |