Ruby EventMachine能否识别所有线程都已完成?
我是一个EM新手,正在编写两个代码来比较同步和异步IO。我正在使用Ruby 1.8.7 同步IO的示例如下: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
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文档: