2011-09-26 2 views
9

open-uriを使用して複数の同時接続を開く方法について知りたいですか?私はスレッドや繊維をいくつか使用する必要があると思うが、私はよくわからない。Ruby(およびopen-uri)を使用して並列で配列内のアイテムを処理する方法

コード例:あなたがこれを行うことができますpeachhttps://rubygems.org/gems/peach)と呼ばれる宝石があり

def get_doc(url) 
    begin 
    Nokogiri::HTML(open(url).read) 
    rescue Exception => ex 
    puts "Failed at #{Time.now}" 
    puts "Error: #{ex}" 
    end 
end 

array_of_urls_to_process = [......] 

# How can I iterate over items in the array in parallel (instead of one at a time?) 
array_of_urls_to_process.each do |url| 
    x = get_doc(url) 
    do_something(x) 
end 

答えて

10

ありピーチに似てParallelと呼ばれる宝石もだが、あります積極的に更新。

-1

require "peach" 

array_of_urls_to_process.peach do |url| 
    do_something(get_doc(url)) 
end 
+0

宝石はjrubyのみです –

7

私はこれがあなたのアイデアを与える願っています:

def do_something(url, secs) 
    sleep secs #just to see a difference 
    puts "Done with: #{url}" 
end 

threads = [] 
urls_ary = ['url1', 'url2', 'url3'] 

urls_ary.each_with_index do |url, i| 
    threads << Thread.new{ do_something(url, i+1) } 
    puts "Out of loop #{i+1}" 
end 
threads.each{|t| t.join} 

おそらく同じようArrayための方法を作成:

class Array 
    def thread_each(&block) 
     inject([]){|threads,e| threads << Thread.new{yield(e)}}.each{|t| t.join} 
    end 
end 

[1, 2, 3].thread_each do |i| 
    sleep 4-i #so first one ends later 
    puts "Done with #{i}" 
end 
2
module MultithreadedEach 
    def multithreaded_each 
    each_with_object([]) do |item, threads| 
     threads << Thread.new { yield item } 
    end.each { |thread| thread.join } 
    self 
    end 
end 

使用法:

arr = [1,2,3] 

arr.extend(MultithreadedEach) 

arr.multithreaded_each do |n| 
    puts n # Each block runs in it's own thread 
end 
0

簡単な方法で使用してスレッド:

threads = [] 

[1, 2, 3].each do |i| 
    threads << Thread.new { puts i } 
end 

threads.each(&:join) 
関連する問題