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