非阻塞ruby数据处理或方法调用

时间:2016-09-15 06:31:11

标签: ruby methods nonblocking

我有一个从串口读取数据的ruby脚本。 该数据可能是一些原始二进制字符串,表示特定的协议数据报(我现在正在尝试使用XBee API)。

这些数据必须在长时间的方法调用中处理,例如:

  1. 阅读序列号
  2. 解析二进制数据报
  3. 解析有效负载
  4. 转换值(即:时间戳,线性回归等的日期)
  5. 转换为JSON
  6. 插入数据库
  7. 数据收入频率快于我的处理能力。我需要做这样的事情:

    loop do
      begin
        res = @xbee.getresponse
        return_super_fast_and_work_that_in_the_background res
      rescue => e
        puts e #append to some log here or something
      end
    end
    

    所以,我可以想象的是,我可能需要收集相当数量的这些数据报,然后批量处理所有这些数据报。

    但我无法想象如何实施这种方法:

    #return_super_fast_and_work_in_the_background()
    

    我能找到的所有示例都与非阻塞IO或网络任务和Eventmachine有关。

    我有redis,可能在这里很方便,除了这个之外还可以启动另一个脚本。 (事实上​​我有一个连接到数据库的sinatra api,以及等待在两者之间使用的pubsub / websocket,以便在新数据到来时通知)

    任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

每次获得更多数据时,您都可以剥离一个线程。

def do_work res
  # parse, transform, insert, etc.
end

def read_loop
  loop do
    begin
      res = @xbee.getresponse
      Thread.new(res, &method(:do_work))
    rescue => e
      # ...
    end
  end
end

如果您的do_work方法触及某些公共资源(日志,数据库,标准输出等),则需要使用Mutex来保护该资源,以防止不同的线程踩到每个其他。另请注意,Ruby并不是真正的多线程,因此虽然这样可以实现快速返回以获取更多数据的目标,但实际上并不能提供处理速度。