0

最適化しようとしているデータ集約型の 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 サービス側で時間を節約できるということでした。(これも早めにできるかも…)

4

3 に答える 3

0

アウトバウンド ネットワーク呼び出しをノンブロッキングで実行できるようにする EventMachine を調べることもできます。最初の結果をユーザーに返し、最終的な結果を ajax 経由で取得できれば、ユーザーの操作はより速く感じられます。

これは、Kayak.com がリアルタイムのフライト検索で行っていることと似ています。

また、結果をキャッシュしてユーザーにすばやく返し、ajax を介して (非同期で読み込んだ) 更新された結果を入力することも検討できます。(そのための適切なUIを理解する必要があります。おそらく、「人気のある」結果をスクロールせずにスクロールせずに表示してから、最新の更新をスクロールせずに表示するか何かに配置するだけです)

*EventMachine は複雑です

于 2011-12-14T22:13:56.953 に答える
0

これ以上の情報がなければなんとも言えませんが、API 応答の待機に多くの時間が費やされているのではないかと私は考えています。

リクエストと API レスポンスの処理が Web サービス プロセスとは別のプロセスで処理される別のアプローチを試してください。フロントエンド コードは、定期的に結果をポーリングし、操作の結果をページに挿入する必要があります。しかし、勝利は、Amazon と Ebay が感謝の気持ちを示すのを待って、要求全体がバックアップされないことです。

役立つプラグインがいくつかありますが、delayed_jobは開始するのに適した場所です。

于 2009-08-20T05:56:48.140 に答える