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

学无所长,一事无成

文章分类

全部博文(69)

文章存档

2015年(19)

2014年(14)

2013年(9)

2012年(17)

2010年(10)

我的朋友

分类: Python/Ruby

2013-11-18 10:38:48

一、 Timer

所有的 Celluloid actor 内部都包含有一个定时器 Timer ,用于规划时间调度任务。这个特性非常有用,可以设置超时检测以及其他时间相关的任务。

先看下  方法:

  1. class TimerExample
  2.   include Celluloid
  3.   attr_reader :fired, :timer

  4.   def initialize
  5.     @fired = false
  6.     @timer = after(3) { puts "Timer fired!"; @fired = true }
  7.   end
  8. end
这个例子中, after 方法会等待3秒钟后调用其后的 block 块,即便是 TimerExample.new 此时早已执行完毕退出。 after 方法的调用会返回一个   对象,通过保存句柄,你可以随时观察或取消相关任务。

你也可以重置计时器,这种技术在你需要设置发呆超时时很有用。示例代码:

  1. class ResetExample
  2.   include Celluloid
  3.   INACTIVITY_TIMEOUT = 900 # wait 15 minutes for inactivity

  4.   def initialize
  5.     @timer = after(INACTIVITY_TIMEOUT) { terminate }
  6.   end

  7.   # Any method that does something and suspends the inactivity timeout
  8.   def activity
  9.     @timer.reset
  10.   end
  11. end
这里通过 @timer.reset 方法调用将计时器清零,重新开始计数。

对于周期性的任务,可以使用  方法,使用方法如下:

  1. Defined in: lib/celluloid/actor.rb
  2. (Object) every(interval, &block)

二、Logging


缺省情况下,Celluloid 会将所有错误信息以及后台跟踪调试信息(如 actor crash 掉)输出到 STDOUT 。你可以将日志信息重定向至你自己的 logger(只要你的 logger 实现了Ruby Logger API 的标准方法,如 #error 等),Ruby 里面的鸭子类型机制就会生效,将所有信息输出至这个logger。举个例子,你可以用 Celluloid 的日志取代 Rails 的日志:

  1. Celluloid.logger = Rails.logger
你所使用的 logger 类必须是线程安全的,这个问题较复杂,暂不讨论。你
也可以禁用 logger:

  1. Celluloid.logger = nil
或将日志记入文件:
  1. require 'logger'
  2. Celluloid.logger = ::Logger.new("mylog.log")
Logging within actors

想要在 actor 内部信息,只需简单的 include Celluloid::Logger 即可:

  1. class MyActor
  2.   include Celluloid
  3.   include Celluloid::Logger

  4.   def initialize
  5.     # This is the same as calling Celluloid::Logger.info
  6.     info "Starting up..."
  7.   end
  8. end
日志是 Rails logger 的鸭子类型,需要能够响应 info、debug、warn、error 方法。
阅读(1165) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~