我正在尝试做一个线程化的活动记录查询。它在开发时测试正确,但它在生产时出现PG::Error (FATAL: sorry, too many clients already)
错误。我对开发和生产都有完全相同的池大小。以下是我尝试在线程中运行的代码片段:
threads = []
acs.each do |a|
threads << Thread.new do
activity = Hash.new
ActiveRecord::Base.connection_pool.with_connection do
whouser = User.find(a.whoid)
target = User.find(a.targetid) if !(a.targetid.blank?)
activity["user_name"] = whouser.user_name
activity["user_id"] = whouser.id
activity["f_uid"] = whouser.f_uid
....
end
end
end
threads.each { |t| t.join }
对此的任何见解都会令人惊叹!
P.S我正在测试我的开发计算机上的生产和开发,但是将其作为生产运行。它在我的实际生产服务器上也遇到了同样的问题。
答案 0 :(得分:2)
在耗尽与服务器的连接数之前,您只能创建这么多线程。最好设置一个简单的工作队列,并让每个线程在此列表中弹出,直到完成。
示例:
tasks = acs
threads = [ ]
10.times do
threads << Thread.new do
while (task = tasks.pop)
# ...
end
end
end
Thread.join
组件将保持不变。