Я изучал возможности параллельной / асинхронной обработки 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)?