我正在通过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行中运行代码,以便其他调用具有优先权?
答案 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合作并且度过了不错的时间,但我没有足够的经验给你一个全心全意的推荐。