https://github.com/celluloid/celluloid/wiki/Frequently-Asked-Questions

问题:我的 Celluloid 一运行就退出,如何解决?

如果你的程序全部由 Celluloid actors 构成,每个 acotr 将运行在自己的线程中,如果 Ruby 主线程没什么事情可做,按照 Ruby 的设计思想,主线程退出时,其他线程也将同时退出。因此,最简单的解决办法就是在主程序中加上一个 sleep。

  1. sleep
还有一个办法,你可以将某个 actor 通过其类方法 run 调度至前台(后面跟上你要传给 new 方法的参数)

  1. MyClass.run
最好的解决方法是构建 Celluloid::SupervisionGroup ,然后将 supervision 树上的顶级 group 置于前台运行:
  1. MyGroup.run
问题:如何禁用日志?
如下即可:Celluloid.logger = nil

问题:如何为 actor 定义一个 finalizer?

  1. class MyActor
  2.   include Celluloid
  3.   finalizer :time_to_go
  4.   def time_to_go
  5.     ...
  6.   end
  7. end

Q: How can I use a custom exception notifier like Airbrake?

A: Celluloid.exception_handler { |ex| MyNotifier.notify(ex) }

Q: How can I raise an exception in the caller without crashing the receiver?

A: abort MyException.new("you f'd up, not me!")


问题:在 actor 中如何实现一个阻塞 IO?(是不是只能用 Celluloid::IO)

你当然可以在 actor 中实现一个阻塞IO,甚至你使用的是原生(native)扩展时也可以(如数据库驱动)。任一 actor 都运行在它自己的线程中,因此阻塞 IO 只会阻塞它自身这个 actor。阻塞IO执行完毕后,该 actor 又可以处理它的 mailbox,堆积的请求又可以响应了。当然,你应该尽量避免一些不确定的阻塞调用,比如监听一个套接字,稍有不慎很容易死锁。这种情况下用 Celluloid::IO 是最好的选择。

Q: What does a FiberStackError or SystemStackError mean?

A: Please see the notes on FiberStackErrors


09-04 12:39