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 に答える