2017-03-14 3 views
0

REST呼び出しでデータをロードしてレンダリングしています。その後、約10秒かかる別のREST APIを呼び出しています。この時点では、これが完了するまで、別のREST呼び出しを行うことはできません。私の質問は、私はこれをどうすればできるのですか?REST-callを同時に実行する方法と低い優先順位を使用する方法

私はスレッドで試しましたが、うまくいかない、何か間違っている、多分スレッドが正しい選択ではないのでしょうか?

これはと呼ばれるルートです。他の呼び出しが優先、のように、持っているので、

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 

は、どのように私は「背景」に22にライン8内のコードを実行できますか?

答えて

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で作業している場合は、スレッドを配列に投げ込み、定期的にクリーンアップするなどの単純な方法ではない可能性があります。

最終的には、非同期ジョブハンドラを調べる必要があります。私はサイドキックと一緒に働いていて、まともな時間を過ごしましたが、私はあなたに全面的な勧告を与えるのに十分な経験がありません。

関連する問題