2

我正在运行以下代码来计算我们应用的 DAU(每日活跃用户):

        EM.run do
            db = EventMachine::Synchrony::ConnectionPool.new(size: numDays) do
            Mysql2::EM::Client.new(
                :host => config[:server],
                :username => config[:user],
                :password => config[:pwd],
                :database => config[:db_name],
                :connect_timeout => 60,
                :cache_rows => false
                )
            end
            slice.to_a.each do
                |day|
                defer = db.aquery("BIG QUERY HERE")

                defer.callback do |obj|
                    puts "#{day} inserted into database"
                    a += 1
                    EM.stop unless a < numDays
                end
            end
        end

start = Time.now
Date.parse(config[:from]).upto(Date.parse(config[:to])).each_slice(config[:slice]) do
    |slice|
    em_dau(config,slice)
    puts "Total time elapsed: #{Time.now-start}"
end

它的作用是获取一年的用户数据,并将其切成 N 大小的块,并为每一天异步执行查询,返回循环并发送另一个 N 块,重复该过程直到覆盖完整的数据集。“问题”(在引号中,因为我不确定这是否真的是一个问题)是在脚本运行时,客户端建立的每个连接似乎都保持在“睡眠”状态,直到整个脚本完成跑步。我假设 ConnectionPool 正在管理数据库连接,但现在我想我需要做一些明确的管理。问题是我实际上不知道如何关闭事件循环中的连接。欢迎任何想法/建议。谢谢。

4

0 回答 0