【问题标题】:How do I output the % complete of resque-status?如何输出 resque-status 的完成百分比?
【发布时间】:2011-12-30 06:13:03
【问题描述】:

我正在为 Resque/Redis 使用 resque-status...

https://github.com/quirkey/resque-status

我基本上想创建一个新的 Sinatra 方法 .. 如下所示。我只有 2 个 JobsWithStatus ,所以它可以返回两个或一个特定的,我真的不在乎。

post '/getstatus' do
  # return status here of all kinds (or specific)
end

然后我想使用每 5 秒检查一次状态的轮询计时器在前端通过 jquery 输出完成百分比。

这就是我所拥有的

post '/refresh' do
  job_id = PostSaver.create(:length => Forum.count)
  status = Resque::Status.get(job_id)
  redirect '/'
end

它在文档中说我可以使用 status.pct_complete 但它总是返回 0?即使这样,我还是 ruby​​ 新手,即使变量显示正确的完成百分比,我也不确定如何使该变量在单独的 sinatra 条目中工作(在 /getstatus 而不是 /refresh 中)。

我试过了,但它一直返回 0

post '/refresh' do
  job_id = PostSaver.create(:length => Forum.count)
  status = Resque::Status.get(job_id)
  sleep 20
  status.pct_complete.to_s
end

【问题讨论】:

    标签: ruby sinatra redis resque


    【解决方案1】:

    在reddit上看到你的问题……

    要使状态返回为 0 以外的值,您需要在运行计算期间使用 at (http://rubydoc.info/github/quirkey/resque-status/master/Resque/JobWithStatus:at) 方法设置百分比。

    您可能不希望在操作中调用sleep。计时器应该在 jQuery 中。


    分享状态

    post '/refresh' do
      job_id = PostSaver.create(:length => Forum.count)
      status = Resque::Status.get(job_id)
      sleep 20
      "{'percent_complete':#{status.pct_complete},'job_id':'#{job_id}'}"
    end
    

    然后无论是获取状态(一些 jQuery#ajax 调用?),您都可以从返回的 JSON 中获取 job_id,然后在您的下一个请求中,您可能会执行以下操作:

    post '/status' do
      status = Resque::Status.get(params['job_id'])
      "{'percent_complete':#{status.pct_complete}}"
    end
    

    【讨论】:

    • 顺便说一句,睡眠只是作为一个测试,让 %age 时间不为 0,我将在单独的 sinatra 方法中使用它。这是一个基本问题,关于如何使“/refresh”方法中的“status”变量在其他地方可用,例如“/getstatus”方法?
    • 通常你不会在动作之间共享变量。例外情况是,如果您正在渲染另一个动作(这可能不是您在 sinatra 中甚至可以做的事情)因为它是 ruby​​,您总是可以定义某种状态方法并调用它。我会编辑一些内容,以便您了解我的意思。
    • 还有一件事,我是否有可能获得所有具有状态的工作,而无需执行 .get(:job_id)?我只有 2 个作业队列和一个工作人员,而不是将 UUID 存储到数据库中以便稍后检索,我希望我可以获取所有活动作业并以这种方式过滤它们(名称、创建时间、状态、排队?等)。我想我知道它有点非传统,但这只是我的第一个应用程序
    • 这是一件相当普遍的事情。 Resque::Status.statuses 将返回实际作业的数组。 Resque::Status.status_ids 将返回一个 id 数组。 Resque.redis.keys("status:*") 将直接使用 redis 为您提供类似的列表,尽管键将带有“状态”前缀。我建议查看 Resque 和 Resque::Status 的源代码。里面有很多有趣的东西。
    • WTF。我只是花了很长时间做一个替代方法。我在他们的网站上到处寻找........ ARLWEKGJWEGEWG。这本可以为我节省几个小时试图弄清楚这一点:|非常感谢...
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多