Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396560
  • 博文数量: 69
  • 博客积分: 1984
  • 博客等级: 上尉
  • 技术积分: 953
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-28 00:43
个人简介

学无所长,一事无成

文章分类

全部博文(69)

文章存档

2015年(19)

2014年(14)

2013年(9)

2012年(17)

2010年(10)

我的朋友

分类: Python/Ruby

2013-10-25 10:52:11

Registry :

通过 Registry 我们可以将 actor 登记注册,随后我们就可以使用符号进行引用,使用方法如下:

  1. >> james = JamesDean.new
  2.  => #<Celluloid::Actor(JamesDean:0x80c27ce0)>
  3. >> Celluloid::Actor[:james] = james
  4.  => #<Celluloid::Actor(JamesDean:0x80c27ce0)>
  5. >> Celluloid::Actor[:james]
  6.  => #<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 方法即可。
  1. >> supervisor = Sheen.supervise "Charlie Sheen"
  2.  => #<Celluloid::Supervisor(Sheen) "Charlie Sheen">

以上代码将创建一个 Celluloid::Supervisor actor,当然也会创建一个 Sheen actor 。new 方法返回的是新创建的实例对象,supervise 返回的是 supervisor。使用 Celluloid::Supervisor#actors 方法可以获取当前有哪些 actors:

  1. >> supervisor = Sheen.supervise "Charlie Sheen"
  2.  => #<Celluloid::Supervisor(Sheen) "Charlie Sheen">
  3. >> charlie = supervisor.actors.first
  4.  => #<Celluloid::Actor(Sheen:0x00000100a312d0)>
如果要创建 Sheen 的同时将其放入 Registry 中,可以使用 supervise_as 方法:

  1. >> Sheen.supervise_as :charlie, "Charlie Sheen"
  2.  => #<Celluloid::Supervisor(Sheen) "Charlie Sheen">
  3. >> charlie = Celluloid::Actor[:charlie]
  4.  => #<Celluloid::Actor(Sheen:0x00000100a312d0)>

Supervision Groups :

Supervision Groups 是用来声明管理一批 actor 的。通过它你可以一次性的批量启停一组 actors,并在程序 crash 的时候自动重启。一个 groups 也可 supervise(监控)其他 groups ,这样你就可以构建一个树状的监控体系,将系统的所有部件纳入监控( 包括supervisors 本身)。

从 Celluloid::SupervisionGroup 派生子类,可以构建监控组:

  1. class MyGroup < Celluloid::SupervisionGroup
  2.   supervise MyActor, as: :my_actor
  3.   supervise AnotherActor, as: :another_actor, args: [{start_working_right_now: true}]
  4.   pool MyWorker, as: :my_worker_pool, size: 5
  5. end
这个 group 启动时,将自动加载 MyActor 和 AnotherActor 并注册别名。还会启动一个包含5个 MyWorker 的 pool。
args: 用于将其后的参数传递给 AnotherAcotr.new 方法,这个参数只能是数组,等效代码:
AnotherActor.new(start_working_right_now: true)

前台启动这个组:MyGroup.run
后台启动这个组:MyGroup.run!

  1. class Person
  2.   include Celluloid

  3.   def initialize(age, height, weight)
  4.     p(age: age, height: height, weight: weight)
  5.   end

  6.   def bar
  7.     rand(20)
  8.   end
  9. end

  10. supervisor = Celluloid::SupervisionGroup.

  11. supervisor.pool(Person, as: :people, args: [1,2,3], size: 3)

  12. p Celluloid::Actor.all.size

  13. 10.times do
  14.   p supervisor[:people].bar
  15. end



阅读(1531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~