Я изучал возможности параллельной/асинхронной обработки Ruby и читал много статей и сообщений в блогах. Я просмотрел EventMachine, волокнам, Revactor, Реи, и т.д., и т.д. К сожалению, я не смог найти простое, эффективное (и не-IO-блокирующий) решения для этого очень простого случая использования:Ruby параллелизм/асинхронная обработка (с простым прецедентом)
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: 123456789(15 units in total)
Operations: RPWRPWRPWRPWRPW
Но я хотел бы, чтобы сделать что-то как это:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Очевидно, что я мог бы запустить три процесса (читатель, процессор & писателя) и передать читать строки из считывателя в очередь процессора, а затем передать обработанные строки в очередь писателя (все координируется с помощью, например, RabbitMQ) , Но прецедент настолько прост, что он просто не чувствует себя хорошо.
Любые подсказки о том, как это можно сделать (без переключения с Ruby на Erlang, Closure или Scala)?
Должны ли быть вызваны записи в том же порядке, в каком они были прочитаны? –
Нет, все дело в том, что они могут быть полностью асинхронными. – Dim