如何同时或以较低优先级运行REST调用

时间:2017-03-14 13:46:42

标签: ruby rest ruby-thread

我正在通过REST调用加载数据并进行渲染。之后,我正在调用另一个REST API,大约需要10秒钟。在这个时候,我不能再做一个REST调用,直到这个完成。我的问题是,我该怎么做?

我试过一个帖子,但它不起作用,也许我做错了,或者线程不是正确的选择?

这是被叫路线:

get '/api/dashboard/:dbnum/block/:blnum/inbackground/:inbackground' do
  user = get_current_userobject
  return assemble_error('LOGIN', 'NOTLOGGEDIN', {}, []).rest_fail if !user

  dbnum,blnum = params[:dbnum].to_i, params[:blnum].to_i
  return { rows: [] }.rest_success if !user.dashboardinfo || !user.dashboardinfo[dbnum] || !user.dashboardinfo[dbnum]['blocks'] || !(block = user.dashboardinfo[dbnum]['blocks'][blnum]) || !respond_to?("dashboard_type_#{block['type']}", true)

  if params[:inbackground] == 'true'

    t = Thread.new do

      t.priority= -1

      ret = method("dashboard_type_#{block['type']}").call(block['filters'], false, true)

      ret.rest_success
    end

    t.join

    t.exit

  else
    ret = method("dashboard_type_#{block['type']}").call(block['filters'], false, false)
    ret.rest_success
  end

end

如何在“后台”中的第8行到第22行中运行代码,以便其他调用具有优先权?

1 个答案:

答案 0 :(得分:0)

命令t.join等待线程完成。如果你想让你的线程在后台运行,那就开火并忘记:

get '/api/dashboard/:dbnum/block/:blnum/inbackground/:inbackground' do
  user = get_current_userobject
  return assemble_error('LOGIN', 'NOTLOGGEDIN', {}, []).rest_fail if !user

  dbnum,blnum = params[:dbnum].to_i, params[:blnum].to_i
  return { rows: [] }.rest_success if !user.dashboardinfo || !user.dashboardinfo[dbnum] || !user.dashboardinfo[dbnum]['blocks'] || !(block = user.dashboardinfo[dbnum]['blocks'][blnum]) || !respond_to?("dashboard_type_#{block['type']}", true)

  if params[:inbackground] == 'true'

    t = Thread.new do

      t.priority= -1

      ret = method("dashboard_type_#{block['type']}").call(block['filters'], false, true)

      ret.rest_success
    end

  else
    ret = method("dashboard_type_#{block['type']}").call(block['filters'], false, false)
    ret.rest_success
  end

end

当然,问题在于,当服务器运行时,会出现一堆死线程。如果您正在使用REST API(设计为无状态),则可能不会像将线程放入数组并定期清理它们那样简单。

最终,我认为,您应该研究异步作业处理程序。我和sidekiq合作并且度过了不错的时间,但我没有足够的经验给你一个全心全意的推荐。