最適化しようとしているデータ集約型の Web アプリケーションを作成しています。フォークとスレッドについて聞いたことがありますが、それらが私がやろうとしていることに適用できるかどうか、もしそうならそれらを実装する方法がわかりません。私のコードは次のようになります。
def search
@amazon_data=Hash.from_xml(item.retrieve_amazon(params[:sku]))
unless @amazon_data['results'] == nil
@amazon_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'Amazon.com',
:price => @amazon_data['results']['item'][i]['price'].to_f,
:shipping => @amazon_data['results']['item'][i]['ship'].to_f,
:condition => @amazon_data['results']['item'][i]['condition'],
:total => @amazon_data['results']['item'][i]['price'].to_f + @amazon_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to Amazon.com',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:isbn]}"
}
end
end
@ebay_data=Hash.from_xml(Book.retrieve_ebay(params[:sku]))
unless @ebay_data['results'] == nil
@ebay_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'eBay',
:price => @ebay_data['results']['item'][i]['price'].to_f,
:shipping => @ebay_data['results']['item'][i]['ship'].to_f,
:condition => 'Used',
:total => @ebay_data['results']['item'][i]['price'].to_f + @ebay_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to eBay',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:sku]}"
}
end
end
end
つまり、基本的には、eBay と Amazon からデータを取得し、ここで解析する 2 つのアクションがあります。これらのアクションを同時に実行するにはどうすればよいですか? フォークまたはスレッドは、私が達成しようとしていることと関係がありますか?
これにより API の時間が半分になりますが、結果を返す方法がわかりません。API結果が返される前に、後続のビューがロードされます....ただし、データは返されます。コーディングするとき
puts @all_books
スレッド内の結果がコンソールに表示されます。ただし、スレッドの外では、結果は返されません。
def search
Thread.new do
@amazon_data=Hash.from_xml(item.retrieve_amazon(params[:sku]))
unless @amazon_data['results'] == nil
@amazon_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'Amazon.com',
:price => @amazon_data['results']['item'][i]['price'].to_f,
:shipping => @amazon_data['results']['item'][i]['ship'].to_f,
:condition => @amazon_data['results']['item'][i]['condition'],
:total => @amazon_data['results']['item'][i]['price'].to_f + @amazon_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to Amazon.com',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:isbn]}"
}
end
end
end
Thread.new do
@ebay_data=Hash.from_xml(Book.retrieve_ebay(params[:sku]))
unless @ebay_data['results'] == nil
@ebay_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'eBay',
:price => @ebay_data['results']['item'][i]['price'].to_f,
:shipping => @ebay_data['results']['item'][i]['ship'].to_f,
:condition => 'Used',
:total => @ebay_data['results']['item'][i]['price'].to_f + @ebay_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to eBay',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:sku]}"
}
end
end
end
end
私は正しい軌道に乗っていますか?スレッド内から結果を返すにはどうすればよいですか? 変数がスレッド内でしかアクセスできないということですか、それとも結果が返される前にプログラムが進行するという事実に問題がありますか?
残念ながら、このアプリケーションでは、API を照会するためにリアルタイムのユーザー入力が必要です。市場での製品の価格設定に関係するため、返されるデータは最新である必要があります...たとえば、ユーザーが SKU を入力すると、その情報を使用してプログラムが該当するサイト (この場合は Amazon と eBay) にリクエストを送信します。 .) 現在、Amazon にリクエストを送信し、データを解析してフォーマットし、次に eBay に移動してデータを解析し、フォーマットします。次に、フォーマットされたデータがビューに表示されます。
私が考えたのは、これらの API 呼び出しを同時に (別のスレッドで?) 行うことができれば、返されたデータを解析して正しくフォーマットするだけで済むため、Web サービス側で時間を節約できるということでした。(これも早めにできるかも…)