Threadを使う

RailsでThread使う機会がないと思っていたけどあった。

controllerで複数のサーバへGetリクエストを送信する、という処理を書きたかった。
そのまま書けば、レスポンスが帰ってこないと次のリクエストを投げれないのでとてもパフォーマンスが悪い。
それでThread使ってみた。

def index
    threads = []
    Connection.all.each do |connection|
      threads << Thread.new do
        ActiveRecord::Base.connection_pool.with_connection do
          connection.health_check    # リクエスト投げてる
          p "finish #{connection.server.nickname}."
        end 
      end 
    end                                                                                                                                                       

    threads.each { |t| t.join }
end
 ActiveRecord::Base.connection_pool.with_connection

というのは、スレッドそれぞれがDBへコネクションを貼らないようにするもの。

threads.each { |t| t.join }

スレッド全てが終了するまで待機する(ような振る舞いをする。詳しくはわからない)。

このままでもパフォーマンス悪いので"threads.each { |t| t.join }"を消して、
すべての処理が終ったタイミングで一部のDOMを更新するみたいなことしたい。それ実現するにはWebSocketさん使うっぽい、、、