Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 如何同时或以较低优先级运行REST调用_Ruby_Rest_Ruby Thread - Fatal编程技术网

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

Ruby 如何同时或以较低优先级运行REST调用,ruby,rest,ruby-thread,Ruby,Rest,Ruby Thread,我通过REST调用加载数据并进行渲染。之后,我调用另一个RESTAPI,大约需要10秒。在这段时间里,我不能再打一次休息电话,直到这一次结束。我的问题是,我该怎么做 我尝试了一个线程,但它不起作用,也许我做错了什么,或者线程不是正确的选择 这就是所谓的路线: get '/api/dashboard/:dbnum/block/:blnum/inbackground/:inbackground' do user = get_current_userobject return assemble

我通过REST调用加载数据并进行渲染。之后,我调用另一个RESTAPI,大约需要10秒。在这段时间里,我不能再打一次休息电话,直到这一次结束。我的问题是,我该怎么做

我尝试了一个线程,但它不起作用,也许我做错了什么,或者线程不是正确的选择

这就是所谓的路线:

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行中的代码,以便其他调用具有优先级?

命令
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一起工作过,过得很愉快,但我没有足够的经验给你一个全心全意的推荐