ruby-on-rails - 如何让 Controller 等待延迟的作业,而应用程序的其余部分继续运行?

标签 ruby-on-rails ruby ruby-on-rails-3 concurrency delayed-job

(此问题是 How do I handle long requests for a Rails App so other users are not delayed too much? 的后续问题)

用户向我的 Rails 应用程序提交答案,该答案会在后端进行长达 10 秒的检查。这会导致所有其他用户延迟,因此我正在尝试 delayed_job gem 将检查移至工作进程。 Worker 代码将结果返回给 Controller 。然而, Controller 没有意识到它应该耐心等待结果,因此会导致错误。

如何让 Controller 等待结果并让应用程序的其余部分同时处理简单的请求?
在 Javascript 中,我们可以使用回调来调用函数而不是返回值。我应该在 Ruby 中做同样的事情并从 Worker 回调 Controller 吗?

更新:
或者,如何从 Worker 调用 Controller 方法?然后我就可以在完成后调用相关操作。

这是相关代码:

Controller :

def submit
  question = Question.find params[:question]
  user_answer = params[:user_answer]
  @result, @other_stuff = SubmitWorker.new.check(question, user_answer)
  render_ajax 
end

提交_worker.rb:

class SubmitWorker
 def check
   #lots of code... 
 end
 handle_asynchronously :check 
end

最佳答案

使用 DJ 来卸载工作绝对没问题,也很正常,但让 Controller 等待响应就违背了要点。

您可以在 check 方法的末尾添加某种形式的回调,以便在作业完成时通知您的用户。

您可以在这个问题中找到一些有关执行通知的讨论:push-style notifications simliar to Facebook with Rails and jQuery

或者,您可以让浏览器定期调用 Controller 操作来检查作业结果 - 理想情况下,结果是 ActiveRecord 对象。同样,您可以在这个问题中找到有关周期性 javascript 的讨论:Rails 3 equivalent for periodically_call_remote

关于ruby-on-rails - 如何让 Controller 等待延迟的作业,而应用程序的其余部分继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090760/

相关文章:

sql - 将散列存储在Sqlite表中。我要使用序列化吗?

ruby - 学习ruby,这几段代码是什么意思?

ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数

ruby-on-rails - 带 rails 的时区 3

ruby-on-rails - Rails REST 路由 : dots in the resource item ID

ruby-on-rails - 如果没有路由匹配则重定向到根页面

ruby-on-rails - ruby on rails - 问题包在 ruby​​ on rails 4.x 上安装 nokogiri 1.7.2

jquery - GON - 在 js.erb + Rails 5 中没有获得值(value)

ruby-on-rails - rails : redirect_to '#{user.role}_url' how do I accomplish this?

ruby - 带有 Ruby 的 XML 数据扫描器 : case statement or dynamic dispatch in term of performance?