Can EventMachine recognize all threads are completed?

Posted by philipjkim on Stack Overflow See other posts from Stack Overflow or by philipjkim
Published on 2012-09-13T07:12:32Z Indexed on 2012/12/06 5:05 UTC
Read the original article Hit count: 116

Filed under:
|
|

I'm an EM newbie and writing two codes to compare synchronous and asynchronous IO. I'm using Ruby 1.8.7.

The example for sync IO is:

def pause_then_print(str)
  sleep 2
  puts str
end

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

puts "Done"

This works as expected, taking 10+ seconds until termination.

On the other hand, the example for async IO is:

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 numbers are shown in 2.x seconds.

Now I explicitly wrote code that EM event loop to be stopped after 2.5 seconds. But what I want is that the program terminates right after printing out 5 numbers. For doing that, I think EventMachine should recognize all 5 threads are done, and then stop the event loop.

How can I do that? Also, please correct the async IO example if it can be more natural and expressive.

Thanks in advance.

© Stack Overflow or respective owner

Related posts about ruby

Related posts about asynchronous