2009-08-20 4 views
0

저는 데이터 최적화 웹 응용 프로그램을 만들고 있습니다. 포킹과 스레딩에 대해 들어 봤지만, 내가하려고하는 것에 해당하는지, 그리고 어떻게 구현하는지에 대해서는 잘 모른다. 내 코드는 다음과 같습니다.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를 호출 할 때 다른 스레드에서 동시에 호출 할 수 있다면 내 웹 서빙 엔드에서 시간을 절약 할 수 있습니다. 필요한 모든 것은 반환 된 데이터를 구문 분석하고 올바르게 형식화하는 것입니다. (어느 쪽이 신속하게 할 수 있을까 ...)

답변

1

그래, 아직도이 경우 작업 스케줄러를 사용하는 것이 나을 것 같아. 이와 같은 동작이 수행 할 수있는 가장 빠른 속도는 2 개의 API 요청 중이 느리고 네트워크 대기 시간, 원격 API로드 등을 보장 할 수 없습니다. 다른 한편으로는 구현해야합니다 일부 자바 스크립트 코드는 주기적으로 폴링하여 작업 완료를 감지하고 사용자에게 결과를 알립니다.

또한 루비 1.8의 스레드 동작은 때때로, 특히 규모에 따라 다소 달라질 수 있으므로 조심하십시오.

0

더 많은 정보없이 말하기는 어렵지만, 대부분의 시간은 API 응답을 기다리는 것입니다.

API 응답의 요청 및 처리가 웹 게재 프로세스와 다른 프로세스에서 처리되는 다른 접근 방법을 시도해보십시오. 프런트 엔드 코드는 주기적으로 결과를 폴링하고 작업 결과를 페이지에 주입해야합니다. 그러나 승리는 아마존과 이베이가 그들의 thang을하기를 기다리면서 전체 요청이 백업되지 않는다는 것입니다.

도울 수있는 몇 가지 플러그인이 있습니다. delayed_job을 시작하는 것이 좋습니다.

0

또한 비 차단 방식으로 아웃 바운드 네트워크 호출을 실행할 수있는 EventMachine을 살펴볼 수도 있습니다. 첫 번째 결과를 사용자에게 반환하고 Ajax를 통해 최종 결과를 얻으면 사용자 상호 작용이 더 빨리 느껴집니다.

이것은 실시간 항공편 검색으로 Kayak.com이하는 것과 비슷합니다.

캐싱 결과를 사용자에게 신속하게 반환 한 다음 ajax를 통해 업데이트 된 결과 (비동기로로드 한 데이터)를 채울 수도 있습니다.

이 * EventMachine가 복잡하다 (당신은 아마 그냥 배 또는 무언가 아래 배 위 '인기'결과, 다음 최신 업데이트를 넣어, 그에 맞는 UI를 파악해야 할 것)

관련 문제