在轨道上的ruby中阻塞I / O.

时间:2013-12-05 17:37:14

标签: ruby-on-rails ruby-on-rails-4

我的应用程序基于从外部API收集的数据构建报告,这可能需要几分钟时间。当然,我不想阻止工人流程。是否可以将数据收集发送到后台并允许用户进一步使用应用程序? 此外,最好使用SSE或WebSockets显示作业的状态。

1 个答案:

答案 0 :(得分:1)

通常,您会将后台作业发送到 Resque 或其他后台作业队列,并让您​​的员工从队列中执行作业。

看起来像这样:

class ReportGenerationJob
  # ...

  def work
    # do expensive operations here
  end
end

r = Resque.new
r << ReportGenerationJob.new(...)   # Not a blocking operation!

一旦完成给定的工作,您的工作人员就可以以某种有用的方式发出信号(例如,通过电子邮件向用户发送作业已完成;将“完成!”值写入您的数据库;等等)。