2013-09-29 3 views
0

Я пытаюсь использовать EM :: Synchrony, чтобы ускорить мои запросы, сделав их асинхронными. После наряду с примерами из github page здесь я делаю 2 асинхронных запросов:Как вернуть результаты запроса MySQL из EventMachine?

EventMachine.synchrony do 
    db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do 
     Mysql2::EM::Client.new(
       :host => config[:server], 
       :username => config[:user], 
       :password => config[:pwd], 
       :database => config[:db_name] 
       ) 
    end 

    multi = EventMachine::Synchrony::Multi.new 
    multi.add :a, db.aquery(" 
     select count(distinct userid) from my_table 
     where date = '2013-09-28' 
     ") 
    multi.add :b, db.aquery(" 
     select count(distinct userid) from my_table 
     where date = '2013-09-27' 
     ") 
    res = multi.perform 
    puts res 

    # p "Look ma, no callbacks, and parallel MySQL requests!" 
    # p res.responses[:callback][0] 

    EventMachine.stop 
end 

> #<EventMachine::Synchrony::Multi:0x00000001eb8da8> 

Мой вопрос, как я могу настроить обратный вызов на самом деле получить значения, возвращаемые запросами? То, что я хотел бы сделать, - это как только запросы будут закончены, объедините их вместе и напишите в другую таблицу или csv или что угодно. Благодарю.

ответ

0

То, что я обнаружил, что следующий код даст мне результаты от запросов:

res.responses[:callback].each do 
     |obj| 
     obj[1].callback do 
      |rows| 
      rows.each do 
       |row| 
       puts row.inspect 
      end 
     end 
    end 
$ruby async_mysql.rb 
{"count(distinct ui)"=>159} 
{"count(distinct ui)"=>168} 
0

Возможно, вам не нужна синхронность? Они все равно асинхронны. https://github.com/brianmario/mysql2#eventmachine

Но если нужно, то, вероятно, ответ

res.responses[:callback][:a] 
    res.responses[:callback][:b] 

https://github.com/igrigorik/em-synchrony/blob/master/lib/em-synchrony/em-multi.rb#L17

+0

Если ничего больше, Synchrony оказывается полезным для управления пулом Connection. Что касается вашего ответа, я просто возвращаю какой-то объект, например # # Как реально видеть данные (т. Е. Строки), возвращаемые запросами? –

Смежные вопросы