ruby的EM库极其强大,包括了反应式框架中常见的:
1. 定时器(周期性,一次性)
2. 事件回调
3. 异步网络操作(简易的http服务器,或者基于EM的httpclient)
另外也有自己的线程池,以支持defer执行,配合上ruby的函数式编程,极其好用。下面是一些实例
def run
# 事件示例
['TERM', 'INT', 'QUIT'].each do |s|
trap(s) do
EM.stop
@pid_file.unlink()
end
end
EM.error_handler do |e|
@logger.error "Eventmachine problem, #{e}"
@logger.error(e)
@logger.error(e.backtrace)
end
# 周期+defer+回调,,, 其中定时器和回调都是发生在主线程的,所以不会有锁问题
callback = proc do |res|
@work_ng_running[res[0]] = @work_ng_running[res[0]] & ~res[1]
end
EM.add_periodic_timer(120) do
i = 0
@work_cnt.times do
i += 1
if (@work_ng_running[i-1] & @TYPE_NG) == 0
@work_ng_running[i-1] = @work_ng_running[i-1] |@TYPE_NG
j = i
EM.defer(nil, callback) do
@workers[j - 1].chk_app
@workers[j - 1].chk_ng
ActiveRecord::Base.clear_active_connections!
[j - 1, @TYPE_NG]
end
else
@logger.error 'duplicate ng schedule' + i.to_s
end
end
end
#启动
#修改线程池
EM.threadpool_size = 50
EM.epoll
EM.run {
subscriber = AlarmChk.new(config)
subscriber.run(options.deamon)
}