Параллелизм / асинхронная обработка в Ruby (с простым вариантом использования)

Я изучал возможности параллельной / асинхронной обработки Ruby и читал много статей и сообщений в блогах. Я просмотрел EventMachine, Fibers, Revactor, Reia и т. Д. И т. Д. К сожалению, мне не удалось найти простое, эффективное (и не блокирующее ввод-вывод) решение для этого очень простого варианта использования:

File.open('somelogfile.txt') do |file|
  while line = file.gets      # (R) Read from IO
    line = process_line(line) # (P) Process the line
    write_to_db(line)         # (W) Write the output to some IO (DB or file)
  end
end

Можно ли видите, мой маленький скрипт выполняет три операции чтение ( R ), процесс ( P ) и запись ( W ). Предположим - для простоты - что каждая операция занимает ровно 1 единицу времени (например, 10 мс), поэтому текущий код будет делать что-то вроде этого (5 строк):

Time:       123456789012345 (15 units in total)
Operations: RPWRPWRPWRPWRPW

Но я бы хотел, чтобы он делал что-то вроде этого:

Time:       1234567 (7 units in total)
Operations: RRRRR
             PPPPP
              WWWWW

Очевидно, я мог бы запустить три процесса (считыватель, процессор и писатель) и передать строки чтения от считывателя в очередь процессора, а затем передать обработанные строки в очередь записи (все координируется, например, через RabbitMQ). Но вариант использования настолько прост, что кажется неправильным.

Любые подсказки о том, как это можно сделать (без перехода с Ruby на Erlang, Closure или Scala)?

6
задан Dim 25 October 2010 в 12:14
поделиться