Question

I'm running this code from the mysql2 gem docs:

require 'mysql2/em'

EM.run do
  client1 = Mysql2::EM::Client.new
  defer1 = client1.query "SELECT sleep(3) as first_query"
  defer1.callback do |result|
    puts "Result: #{result.to_a.inspect}"
  end

  client2 = Mysql2::EM::Client.new
  defer2 = client2.query "SELECT sleep(1) second_query"
  defer2.callback do |result|
    puts "Result: #{result.to_a.inspect}"
  end
end

It runs fine, printing the results

Result: [{"second_query"=>0}]
Result: [{"first_query"=>0}]

but then the script just hangs and never returns to the command line. Any idea what is going on?

Was it helpful?

Solution

EM.run will start an EventMachine reactor. That reactor just loops and loops and loops until you somehow tell it to stop. You can manually stop it using EM.stop.

In your case, you might want to check for the callback results and stop the reactor when both callbacks fired. Ilya's em-http-request library provides a nice interface for exactly that use case. Might be worth a look.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top