Ruby并发/异步处理(具有简单的用例)

Dim*_*Dim 6 ruby concurrency asynchronous fiber eventmachine

我正在研究ruby的并行/异步处理功能,并阅读了许多文章和博客文章.我浏览了EventMachine,Fibers,Revactor,Reia等等.不幸的是,我无法为这个非常简单的用例找到一个简单,有效(和非IO阻塞)的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

你可以看到,我的小脚本正在执行三个操作:读取(R),处理(P)和写入(W).让我们假设 - 为简单起见 - 每个操作只花费1个单位时间(例如10ms),因此当前代码将执行类似这样的操作(5行):

Time:       123456789012345 (15 units in total)
Operations: RPWRPWRPWRPWRPW
Run Code Online (Sandbox Code Playgroud)

但是,我希望它能做到这样的事情:

Time:       1234567 (7 units in total)
Operations: RRRRR
             PPPPP
              WWWWW
Run Code Online (Sandbox Code Playgroud)

显然,我可以运行三个进程(读取器,处理器和写入器)并将读取器的读取行传递到处理器队列,然后将处理过的行传递到写入器队列(所有这些都通过例如RabbitMQ进行协调).但是,用例非常简单,感觉不对.

关于如何做到这一点的任何线索(没有从Ruby切换到Erlang,Closure或Scala)?

Mar*_*mas 1

查看 peach ( http://peach.rubyforge.org/ )。做一个并行的“每个”再简单不过了。然而,正如文档所述,您需要在 JRuby 下运行才能使用 JVM 的本机线程。

有关各种 Ruby 解释器的多线程功能的详细信息,请参阅 Jorg Mittag 对这个 SO 问题的回答。