当前位置: 首页 > 工具软件 > EventMachine > 使用案例 >

ruby eventmachine实践

陈渊
2023-12-01

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)
  }


 类似资料: