0

我正在通过 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 行内运行代码,以便其他调用具有优先级?

4

1 回答 1

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 合作过,过得不错,但我没有足够的经验给你一个全心全意的推荐。

于 2017-03-14T14:03:14.303 回答