我正在运行以下代码来计算我们应用的 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 正在管理数据库连接,但现在我想我需要做一些明确的管理。问题是我实际上不知道如何关闭事件循环中的连接。欢迎任何想法/建议。谢谢。