小编Dim*_*Dim的帖子

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

我正在研究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)?

ruby concurrency asynchronous fiber eventmachine

6
推荐指数
1
解决办法
1726
查看次数

标签 统计

asynchronous ×1

concurrency ×1

eventmachine ×1

fiber ×1

ruby ×1