2016-09-15 2 views
2

У меня есть скрипт ruby, который считывает данные из последовательного порта. Эти данные могут представлять собой некоторую необработанную двоичную строку, которая представляет собой конкретную дейтаграмму протокола (я пытаюсь использовать XBee API, как сейчас).Неблокирующая обработка данных ruby ​​или вызов метода

эти данных должны быть обработаны в долгосрочной перспективе вызовов методов, что-то вроде:

  1. Читать серийное
  2. Анализировать двоичную дейтаграмму
  3. Анализировать полезную нагрузку
  4. Transform значения (например: даты от временные метки, линейные регрессии и т. д.)
  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 вокруг, может быть удобно здесь, и вы можете запустить другие скрипты в сторону этого. (на самом деле у меня есть synatra 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 не является действительно многопоточным, поэтому, хотя это позволит вам быстро вернуться, чтобы получить больше данных, на самом деле он не будет предлагать ускорение обработки.

Смежные вопросы