2016-09-15 5 views
2

シリアルポートからデータを読み取るルビースクリプトがあります。 そのデータは、特定のプロトコルデータグラムを表す生のバイナリ文字列である可能性があります(私は今のところ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に関連しています。

私はここに便利ですが、ここに便利かもしれませんが、このスクリプト以外に別のスクリプトを起動することもできます。 (実際に私はデータベースに接続された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は本当にマルチスレッド化されていないことに注意してください。これにより、すぐに返ってより多くのデータを取得するという目標を達成できますが、実際には処理の高速化は実現しません。

関連する問題