2016-09-15 74 views
2

我有一個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)

任何建議將不勝感激!

回答

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並不是真正的多線程,所以雖然這將實現快速返回以獲取更多數據的目標,但實際上並不會提供處理速度提升。