저는 데이터 최적화 웹 응용 프로그램을 만들고 있습니다. 포킹과 스레딩에 대해 들어 봤지만, 내가하려고하는 것에 해당하는지, 그리고 어떻게 구현하는지에 대해서는 잘 모른다. 내 코드는 다음과 같습니다.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
그래서 기본적으로 이베이와 아마존에서 데이터를 검색하고 여기에서 구문 분석하는 두 가지 작업이 있습니다. 이 두 가지 작업을 동시에 수행하려면 어떻게해야합니까? 포크 나 실은 내가 성취하고자하는 것과 관련이 있습니까?
이렇게하면 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를 호출 할 때 다른 스레드에서 동시에 호출 할 수 있다면 내 웹 서빙 엔드에서 시간을 절약 할 수 있습니다. 필요한 모든 것은 반환 된 데이터를 구문 분석하고 올바르게 형식화하는 것입니다. (어느 쪽이 신속하게 할 수 있을까 ...)