我正在制作一个数据密集型Web应用程序,我正试图优化。我听说过分叉和线程化,但我不知道它们是否适用于我正在尝试做的事情,以及如何实现它们。我的代码如下所示:如何加快我的Ruby应用程序?
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和亚马逊的数据,并在此解析它两个动作。我该如何让这两个动作同时运行?叉子或线程与我想要完成的事情有什么关系?
这会将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,并且通过该信息该程序将向适用的网站(亚马逊和eBay在这种情况下。)目前,它向亚马逊提出请求,解析数据,格式化数据,然后转向eBay,分析数据并格式化数据。然后格式化的数据显示在视图中。
我的想法是,如果我可以同时进行这些API调用(在不同的线程上),它可以节省Web服务端的时间,因为所有需要的是解析返回的数据并正确格式化。 (我可能也可以加快......)