【问题标题】:non-blocking ruby data processing or method call非阻塞 ruby​​ 数据处理或方法调用
【发布时间】:2016-09-16 00:08:58
【问题描述】:

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

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

  1. 读取串口
  2. 解析二进制数据报
  3. 解析负载
  4. 转换值(即:来自时间戳、线性回归等的日期)
  5. 转换为 JSON
  6. 插入数据库

数据收入频率快于我的处理能力。我需要做这样的事情:

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 等待在两者之间使用以通知新数据何时到来)

任何建议将不胜感激!

【问题讨论】:

    标签: ruby methods nonblocking


    【解决方案1】:

    您可以在每次获得更多数据时分离一个线程。

    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 并不是真正的多线程,因此虽然这将实现您快速返回以获取更多数据的目标,但它实际上不会提供处理加速。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多