3

私はルビーのマルチスレッディングにかなり慣れていないため、開始方法について混乱していました。現在アプリを作成していますが、大量の画像を取得する必要があるため、別のスレッドで実行したいと考えています。以下のコードに示すようにプログラムを実行したかったのです。

問題: ここで見られる問題は、bar_method のフェッチが速くなり、スレッドが終了するため、キューに追加され続けるが処理されないことです。新しいアイテムがキューに追加されたことを bar_method スレッドに警告する同期の方法はありますか?

def foo_method 
  queue created - consists of url to fetch and a callback method
  synch = Mutex.new
  Thread.new do
    bar_method synch, queue 
  end
  100000.times do
    synch.synchronize do
      queue << {url => img_url, method_callback => the_callback}
    end
  end
end
def bar_method synch_obj, queue
  synch_obj.synchronize do
    while queue isn't empty
        pop the queue. fetch image and call the callback
    end   
  end
end 
4

1 に答える 1

2

インターネットからファイルを取得し、並列リクエストを使用する必要がある場合は、Typhoeus と Hydraを強くお勧めします。

ドキュメントから:

hydra = Typhoeus::Hydra.new
10.times.map{ hydra.queue(Typhoeus::Request.new("www.example.com", followlocation: true)) }
hydra.run

Hydra で同時接続数を設定できます。

:max_concurrency (整数) — 作成する最大同時接続数。デフォルトは 200 です。

2 番目の推奨事項として、Curbを調べます。繰り返しますが、そのドキュメントから:

# make multiple GET requests
easy_options = {:follow_location => true}
multi_options = {:pipeline => true}

Curl::Multi.get('url1','url2','url3','url4','url5', easy_options, multi_options) do|easy|
  # do something interesting with the easy response
  puts easy.last_effective_url
end

どちらも Curl の上に構築されているため、基盤となるテクノロジや堅牢性に実質的な違いはありません。違いは、使用できるコマンドです。

多くの注目を集めるもう 1 つの gem は EventMachine です。同時リクエストを許可するEM -HTTP-Requestがあります。

EventMachine.run {
  http1 = EventMachine::HttpRequest.new('http://google.com/').get
  http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get

  http1.callback { }
  http2.callback { } 
end
于 2013-01-05T01:35:13.070 に答える