1

我正在尝试做一个线程化的活动记录查询。它在开发中正确测试,但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 }  

对此的任何见解都会令人惊叹!

PS我正在我的开发计算机上测试生产和开发,但将其作为生产运行。它在我的实际生产服务器上也有同样的问题。

4

1 回答 1

2

在耗尽与服务器的连接数之前,您只能创建这么多线程。最好设置一个简单的工作队列并让每个线程在此列表中弹出直到完成。

例子:

tasks = acs
threads = [ ]

10.times do
  threads << Thread.new do
    while (task = tasks.pop)
      # ...
    end
  end
end

Thread.join组件将保持不变。

于 2013-02-11T02:41:27.400 回答