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 关于 thread-safety。但是,您需要成为专业会员才能观看。

于 2012-09-24T10:43:24.257 回答