问题:我的 Celluloid 一运行就退出,如何解决?
如果你的程序全部由 Celluloid actors 构成,每个 acotr 将运行在自己的线程中,如果 Ruby 主线程没什么事情可做,按照 Ruby 的设计思想,主线程退出时,其他线程也将同时退出。因此,最简单的解决办法就是在主程序中加上一个 sleep。
还有一个办法,你可以将某个 actor 通过其类方法 run 调度至前台(后面跟上你要传给 new 方法的参数)
最好的解决方法是构建 Celluloid::SupervisionGroup ,然后将 supervision 树上的顶级 group 置于前台运行:
问题:如何禁用日志?
如下即可:Celluloid.logger = nil
问题:如何为 actor 定义一个 finalizer?
-
class MyActor
-
include Celluloid
-
finalizer :time_to_go
-
def time_to_go
-
...
-
end
-
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
阅读(1411) | 评论(0) | 转发(0) |