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

学无所长,一事无成

文章分类

全部博文(69)

文章存档

2015年(19)

2014年(14)

2013年(9)

2012年(17)

2010年(10)

我的朋友

分类: Python/Ruby

2013-11-19 00:42:34



问题:我的 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


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