0

EM::Synchrony を使用して、クエリを非同期にすることでクエリを高速化しようとしています。こちらのgithub ページの例に従って、2 つの非同期クエリを作成しています。

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 などに書き込むことです。ありがとう。

4

2 に答える 2

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}
于 2013-09-30T21:21:27.193 に答える
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

于 2013-09-30T11:52:48.677 に答える