1

ユーザー モデルがあり、新しいユーザー モデルを作成するときに、ユーザーの作成後にネットワーク/バックグラウンド タスクを実行する必要がある新しいスレッドを生成するとします。

def create
  @user = User.new(params[:user])

  collect_info_async(@user)

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'User created.' }
    else
      format.html { render action: "new" }
    end
  end
end


def collect_info_async(user)
  Thread.new do
    logger.info "Thread starting" #Gets logged correctly

    #Do some network requests, perform calculations, etc.

    usr = User.find_by_id(user.id).update_attributes(:info => gathered_info)
    logger.info "Thread finishing"


   end
end

新しいユーザーを作成すると、ログに「スレッドの開始」が表示されますが、実際に終了すると同時に「スレッドの終了」が表示されません。コンソールから User.find を実行するか、しばらくしてからユーザー ページを更新する必要があります。その後、「スレッドの終了」ログを確認できます。では、非同期タスクが実際に終了するのはいつでしょうか? そして、スレッドを使用するのは正しい選択ですか? Ruby 1.9.3 と Rails 3.2.8 を使用しています。

4

1 に答える 1

1

現時点では、スレッドを使用するのではなく、Rails のバックグラウンド ジョブに専用のワーカー プロセスを使用することをお勧めします。Sidekiq、Resque、delayed_job などを使用できます。RailsCasts には、それらに関する優れたスクリーンキャストがいくつかあります。

実際には、スレッドセーフに関する優れた RailsCastがあります。ただし、視聴するにはプロ会員である必要があります。

于 2012-09-24T10:43:24.257 に答える