2013-09-29 31 views
0

我想通过使他们异步来加速我的查询使用EM :: Synchrony。从这里github page我做2个异步查询的例子沿着以下内容:如何从EventMachine返回MySQL查询结果?

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

也许你不需要Synchrony?无论如何,它们都是异步的。 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似乎对管理连接池非常有用。关于你的答案,我只是找回像#如何实际查看查询返回的数据(即行)? –