Ruby EventMachine能否识别所有线程都已完成?

Ruby EventMachine能否识别所有线程都已完成?,ruby,asynchronous,eventmachine,Ruby,Asynchronous,Eventmachine,我是一个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" require 'rubygems' require 'eventmachine' def pause_then_print(str) Thread.new do EM.r

我是一个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"
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
这与预期一样,需要10秒以上的时间才能终止

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

def pause_then_print(str)
  sleep 2
  puts str
end

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

puts "Done"
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秒内显示

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

我该怎么做?另外,如果异步IO示例更自然、更具表现力,请更正它


提前感谢。

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

在检测工作何时完成方面,您可以让
EM.defer
在其操作完成时执行回调。因此,您可以在其中添加一点代码,在
i==4
或类似情况下添加回调。有关如何添加回调,请参阅EM文档: