一、 Timer
所有的 Celluloid actor 内部都包含有一个定时器 Timer ,用于规划时间调度任务。这个特性非常有用,可以设置超时检测以及其他时间相关的任务。
先看下 方法:
-
class TimerExample
-
include Celluloid
-
attr_reader :fired, :timer
-
-
def initialize
-
@fired = false
-
@timer = after(3) { puts "Timer fired!"; @fired = true }
-
end
-
end
这个例子中, after 方法会等待3秒钟后调用其后的 block 块,即便是 TimerExample.new 此时早已执行完毕退出。 after 方法的调用会返回一个 对象,通过保存句柄,你可以随时观察或取消相关任务。
你也可以重置计时器,这种技术在你需要设置发呆超时时很有用。示例代码:
-
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
这里通过 @timer.reset 方法调用将计时器清零,重新开始计数。
对于周期性的任务,可以使用 方法,使用方法如下:
-
Defined in: lib/celluloid/actor.rb
-
(Object) every(interval, &block)
二、Logging
缺省情况下,Celluloid 会将所有错误信息以及后台跟踪调试信息(如 actor crash 掉)输出到 STDOUT 。你可以将日志信息重定向至你自己的 logger(只要你的 logger 实现了Ruby Logger API 的标准方法,如 #error 等),Ruby 里面的鸭子类型机制就会生效,将所有信息输出至这个logger。举个例子,你可以用 Celluloid 的日志取代 Rails 的日志:
-
Celluloid.logger = Rails.logger
你所使用的 logger 类必须是线程安全的,这个问题较复杂,暂不讨论。你
也可以禁用 logger:
或将日志记入文件:
-
require 'logger'
-
Celluloid.logger = ::Logger.new("mylog.log")
Logging within actors
想要在 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
日志是 Rails logger 的鸭子类型,需要能够响应 info、debug、warn、error 方法。
阅读(1178) | 评论(0) | 转发(0) |