Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何输出resque状态的完成百分比?_Ruby_Sinatra_Redis_Resque - Fatal编程技术网

Ruby 如何输出resque状态的完成百分比?

Ruby 如何输出resque状态的完成百分比?,ruby,sinatra,redis,resque,Ruby,Sinatra,Redis,Resque,我正在对resque/Redis使用resque状态 我基本上想创建一个新的Sinatra方法。。像下面这样。我只有两份工作的状态,所以它可以返回两个或一个具体的,我真的不在乎 post '/getstatus' do # return status here of all kinds (or specific) end 然后我想通过jquery在前端使用轮询计时器输出完成百分比,该计时器每5秒检查一次状态 这就是我所拥有的 post '/refresh' do job_id = P

我正在对resque/Redis使用resque状态

我基本上想创建一个新的Sinatra方法。。像下面这样。我只有两份工作的状态,所以它可以返回两个或一个具体的,我真的不在乎

post '/getstatus' do
  # return status here of all kinds (or specific)
end
然后我想通过jquery在前端使用轮询计时器输出完成百分比,该计时器每5秒检查一次状态

这就是我所拥有的

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

在reddit上看到你的问题

要使状态返回为0以外的值,需要使用
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中获取作业id,然后在下一个请求中,您可以执行以下操作:

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

顺便说一句,睡眠只是一个测试,让%年龄时间不为0,我将在一个单独的sinatra方法中进行测试。这是一个关于如何使“/refresh”方法中的“status”变量在其他地方可用的基本问题,比如“/getstatus”方法?通常情况下,您不会在操作之间共享变量。例外情况是,如果您正在呈现另一个操作(这在sinatra中可能不是您可以做的事情),因为它是ruby,您可以始终定义某种状态方法,然后调用它。我将在中编辑一些内容,以便您了解我的意思。还有一件事,我是否可以不必执行任何操作就获得所有jobswithstatus。获取(:job\u id)?我只有两个作业队列和一个工作队列,我希望我可以获取所有活动作业的状态并以这种方式过滤它们(名称、创建时间、状态、排队?),而不是将UUID存储到数据库中以便稍后检索。我知道这有点非常规,但这只是我的第一个应用程序,这是一个相当普遍的事情
Resque::Status.Status
将返回实际作业的数组
Resque::Status.Status\u id
将返回一个id数组
Resque.redis.keys(“status:*”)
将直接使用redis为您提供一个类似的列表,尽管这些键前面会加上“status”。我建议戳一下Resque和Resque::Status的源代码。里面有很多有趣的东西。我只是花了这么长时间用另一种方法。我在他们的网站上到处找。。。。。。。。ARLWEKGJWEGEWG。这本可以帮我省下几个小时来想办法:|非常感谢。。。