0

我是 EM 新手,编写了两个代码来比较同步和异步 IO。我正在使用 Ruby 1.8.7。

同步 IO 的示例是:

def pause_then_print(str)
  sleep 2
  puts str
end

5.times { |i| pause_then_print(i) }

puts "Done"

这按预期工作,需要 10 多秒才能终止。

另一方面,异步 IO 的示例是:

require 'rubygems'
require 'eventmachine'

def pause_then_print(str)
  Thread.new do
    EM.run do
      sleep 2
      puts str
    end
  end
end

EventMachine.run do
  EM.add_timer(2.5) do
    puts "Done"
    EM.stop_event_loop
  end
  EM.defer(proc do
    5.times { |i| pause_then_print(i) }
  end)
end

5 个数字在 2.x 秒内显示。

现在我明确编写了 EM 事件循环在 2.5 秒后停止的代码。但我想要的是程序在打印出 5 个数字后立即终止。为此,我认为EventMachine应该认识到所有 5 个线程都已完成,然后停止事件循环。

我怎样才能做到这一点?另外,请更正异步 IO 示例,如果它可以更自然和更具表现力。

提前致谢。

4

1 回答 1

1

关于你的异步代码的一些事情。EM.defer 安排代码在线程上执行。然后,您将创建更多线程。当您可以在创建循环中使用 EM.defer 时,这样做没有多大意义。这有一个额外的好处,即 EM 将从其内部线程池中为线程提供服务,这应该会更快一些,因为没有线程创建开销。(请注意,我相信 EM 线程池中有 20 个线程,因此您希望保持在该数字以下)。像下面这样的东西应该可以工作(虽然我还没有测试过)

require 'rubygems'
require 'eventmachine'

def pause_then_print(str)
  sleep 2
  puts str
end

EventMachine.run do
  EM.add_timer(2.5) do
    puts "Done"
    EM.stop_event_loop
  end
  5.times do |i|
    EM.defer { pause_then_print(i) }
  end
end

在检测工作何时完成方面,您可以EM.defer在其操作完成时执行回调。因此,您可以在其中添加一些代码来添加回调 wheni == 4或类似的东西。请参阅 EM 文档了解如何添加回调:EM.defer

于 2012-12-06T05:02:20.103 回答