Timer : https://github.com/celluloid/celluloid/wiki/Timers
所有的 Celluloid actor 内部都包含有一个定时器 Timer ,用于规划时间调度任务。这个特性非常有用,可以设置超时检测以及其他时间相关的任务。
先看下 Celluloid#after 方法:
- class TimerExample
- include Celluloid
- attr_reader :fired, :timer
- def initialize
- @fired = false
- @timer = after(3) { puts "Timer fired!"; @fired = true }
- end
- end
你也可以重置计时器,这种技术在你需要设置发呆超时时很有用。示例代码:
- class ResetExample
- include Celluloid
- INACTIVITY_TIMEOUT = 900 # wait 15 minutes for inactivity
- def initialize
- @timer = after(INACTIVITY_TIMEOUT) { terminate }
- end
- # Any method that does something and suspends the inactivity timeout
- def activity
- @timer.reset
- end
- end
对于周期性的任务,可以使用 Celluloid#every 方法,使用方法如下:
- Defined in: lib/celluloid/actor.rb
- (Object) every(interval, &block)
二、Logging
https://github.com/celluloid/celluloid/wiki/Logging
缺省情况下,Celluloid 会将所有错误信息以及后台跟踪调试信息(如 actor crash 掉)输出到 STDOUT 。你可以将日志信息重定向至你自己的 logger(只要你的 logger 实现了Ruby Logger API 的标准方法,如 #error 等),Ruby 里面的鸭子类型机制就会生效,将所有信息输出至这个logger。举个例子,你可以用 Celluloid 的日志取代 Rails 的日志:
- Celluloid.logger = Rails.logger
也可以禁用 logger:
- Celluloid.logger = nil
- require 'logger'
- Celluloid.logger = ::Logger.new("mylog.log")
想要在 actor 内部信息,只需简单的 include Celluloid::Logger 即可:
- class MyActor
- include Celluloid
- include Celluloid::Logger
- def initialize
- # This is the same as calling Celluloid::Logger.info
- info "Starting up..."
- end
- end