2011-09-26 16 views
9

Tôi tự hỏi làm thế nào tôi có thể đi về việc mở nhiều kết nối đồng thời bằng cách sử dụng mở-uri? tôi nghĩ rằng tôi cần phải sử dụng luồng hoặc sợi một số cách nhưng tôi không chắc chắn.Làm thế nào để xử lý các mục trong một mảng trong song song bằng cách sử dụng Ruby (và mở-uri)

đang

Ví dụ:

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 

Trả lời

10

Ngoài ra còn có một viên ngọc gọi Parallel đó cũng tương tự như Peach, nhưng là chủ động cập nhật.

-1

Có một viên ngọc gọi peach (https://rubygems.org/gems/peach) cho phép bạn làm điều này:

require "peach" 

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

Đá quý chỉ là màu nâu –

7

Tôi hy vọng điều này mang đến cho bạn một ý tưởng:

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} 

Có lẽ việc tạo ra một phương pháp để Array như:

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 

Cách sử dụng:

arr = [1,2,3] 

arr.extend(MultithreadedEach) 

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

Một phương pháp đơn giản sử dụng chủ đề:

threads = [] 

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

threads.each(&:join) 
Các vấn đề liên quan