我和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;时随时查看后台工作的状态。网页上的按钮...(长时间工作只能由管理员帐户解雇)....
提前感谢某些方向...
答案 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很有帮助。你有工人处理你的后台工作吗?如果不是这样,您可以在终端轻松完成并观察后台工作流程。我确实看到了实际发生的事情以及了解发生了什么。