我正在尝试执行线程化活动记录查询。它在开发过程中进行了适当的测试,但在生产过程中给了我一个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我在我的开发计算机上测试生产和开发,但将其作为生产运行。它在我的实际生产服务器上也出现了同样的问题。
在耗尽与服务器的连接数量之前,您只能创建这么多线程。最好是建立一个简单的工作队列,并让每个线程在列表中弹出,直到完成为止。
示例:
tasks = acs
threads = [ ]
10.times do
threads << Thread.new do
while (task = tasks.pop)
# ...
end
end
end
Thread.join
组件将保持不变。