gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:27 26 4
gpt4 key购买 nike

我有一个从串行端口读取数据的 ruby​​ 脚本。该数据可能是一些表示特定协议(protocol)数据报的原始二进制字符串(我现在正在尝试 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等待在两者之间使用以在新数据到来时通知)

任何建议将不胜感激!

最佳答案

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

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 方法涉及一些公共(public)资源(日志、数据库、标准输出等),您将需要使用Mutex 来保护该资源。以防止不同的线程相互踩踏。另请注意,Ruby 并非真正的多线程,因此虽然这将实现您快速返回以获取更多数据的目标,但它实际上不会提供处理加速。

关于ruby - 非阻塞ruby数据处理或方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39504392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com