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