这种Rails多线程方法有什么问题吗?

时间:2014-05-30 11:44:20

标签: javascript ruby-on-rails ruby multithreading

我和Rails一起战斗并且轮询很长时间的工作(30分钟左右......) 我已经阅读了许多其他选项,例如使用BackgroundRb或后台工作,但是现在我尝试过这样的事情:

class HeavyController < ApplicationController    

def poll
  render text: $longlog
end

def longjob
  Thread.new do 
    tasks.each do |j|
      # here's the job proc, CPU & IO intense
      $longlog << "some message about current job status"
    end   
  end
end

end

在客户方面我已经编写了简单的javascript setTimeout,它会反复调用$.get('poll_log', {...})并设置显示进度的对话框.html()

除了使用Ruby的全局$longlog(这显然是错误的)之外,这种方法可能会产生哪些其他问题? 我是否应该将其用于解锁WEBRick的多线程风味?但是,如果WEBRick因超时原因决定杀死持久的任务呢?可以从我的方法中使用默认配置杀死线程吗? 我的应用程序不会被用户密集使用,绝对不需要每秒处理数千个请求。相反,我需要有机会在我点击&#34;显示状态&#34;时随时查看后台工作的状态。网页上的按钮...(长时间工作只能由管理员帐户解雇)....

提前感谢某些方向...

2 个答案:

答案 0 :(得分:3)

你不应该在生产中对Webrick运行任何东西,它只适合本地测试。如果您运行应用程序的多个实例,那么您的线程解决方案将无法工作,只有当您的下一个请求遇到同一个实例时,它才会起作用。

将该东西放入后台作业处理器。它们很容易设置。 BackgroundRb很老了,几乎死了。这些天的选择是Sidekiq,Resque,DelayedJob和Backburner。延迟工作可能是最容易上手的,因为它不需要任何额外的服务。

后台工作应该发布它&#34; log&#34;到数据库,像LongjobLog.create(:message => "did stuff"),然后您的Javascript民意调查事项应该请求ID为&gt;的项目last_received_id只获取新行。

答案 1 :(得分:0)

根据我使用像DelayedJob这样的宝石的经验非常好。您会发现link很有帮助。你有工人处理你的后台工作吗?如果不是这样,您可以在终端轻松完成并观察后台工作流程。我确实看到了实际发生的事情以及了解发生了什么。