Ruby 如何同时或以较低优先级运行REST调用
我通过REST调用加载数据并进行渲染。之后,我调用另一个RESTAPI,大约需要10秒。在这段时间里,我不能再打一次休息电话,直到这一次结束。我的问题是,我该怎么做 我尝试了一个线程,但它不起作用,也许我做错了什么,或者线程不是正确的选择 这就是所谓的路线: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
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一起工作过,过得很愉快,但我没有足够的经验给你一个全心全意的推荐