2013-03-26 19 views
5

Metin dosyasını ayrıştıran ve verileri paralel olarak indiren bir program hazırladım. İndirme yöntemini 9 veya daha az sayıda iş parçacığında çalıştırdığınızda, programda hata yok. Ancak, yöntemi 10 veya daha fazla iş parçacığında çalıştırdığınızda, program "` initialize ': getaddrinfo: Name veya service bilinmiyor (SocketError) "hatasını atar. Paralel olarak çalışmak için bazı algoritmalar denedim, ama aynı sorun ortaya çıktı. Ben 'açık' yöntemine geçti url koymak (açık-uri) "Ad veya hizmet bilinmez" hata tarayıcıya olur, ve bu url geçerli olduğunu doğruladı ve doğru data.Here en kısmi kod aldı."Ad veya hizmet bilinmiyor (SocketError)" hatası birçok iş parçacığında çalıştırılırken hata

jobs = [] 
aps = [] 
.... 
#jobs are pushed into jobs[] 
.... 
max_thread = 15 
loop do 
    ary_threads = [] 
    max_thread.times do |i| 
    break if jobs.size == 0 
    job = jobs.pop 
    ary_threads << Thread.start { 
     begin 
     request(job[0],job[1]).each do |ap| #in "request" method, open(url)are called 
      aps.push(ap) 
     end 
     end 
    } 
end 
ary_threads.each { |th| th.join } 
break if jobs.size == 0 
end 

ve hata

/usr/lib/ruby/1.9.1/net/http.rb:762:in `initialize': getaddrinfo: Name or service not known (SocketError) 
from /usr/lib/ruby/1.9.1/net/http.rb:762:in `open' 
from /usr/lib/ruby/1.9.1/net/http.rb:762:in `block in connect' 
from /usr/lib/ruby/1.9.1/timeout.rb:54:in `timeout' 
from /usr/lib/ruby/1.9.1/timeout.rb:99:in `timeout' 
from /usr/lib/ruby/1.9.1/net/http.rb:762:in `connect' 
from /usr/lib/ruby/1.9.1/net/http.rb:755:in `do_start' 
from /usr/lib/ruby/1.9.1/net/http.rb:744:in `start' 
from /usr/lib/ruby/1.9.1/open-uri.rb:306:in `open_http' 
from /usr/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open' 
from /usr/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' 
from /usr/lib/ruby/1.9.1/open-uri.rb:201:in `catch' 
from /usr/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' 
from /usr/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' 
from /var/lib/gems/1.9.1/gems/open-uri-cached-0.0.5/lib/open-uri/cached.rb:10:in `open_uri' 
from /usr/lib/ruby/1.9.1/open-uri.rb:677:in `open' 
from /usr/lib/ruby/1.9.1/open-uri.rb:33:in `open' 
from Test1.rb:42:in `request' 
from Test1.rb:77:in `block (3 levels) in <main>' 

Bunun nedeni nedir

mı? Benzer sorunla karşılaştı mı? Lütfen bana yardım edin!

3 saat ilk sorudan sonra ben geçici çözüm bulundu. Ben '~ kurtarma ~ yeniden deneme ~ başlamak' ucu ile 'isteği' yönteminde 'açık' yöntemini sandviç Eğer , hata olduğunda ikinci kez 'açık' called.Here kodunu olmaz. İstisna yakalama ve url ve "yeniden deneniyor", url ve "yeniden deneniyor" gösterdikten sonra

begin 
    response = open(url) 
rescue Exception 
    puts url 
    puts "retrying" 
    retry 
end 

görüntülenecek asla ve program düzgün çalışmasını :) Ama yine de bu soruna neden şeyi bulamıyorum.

+0

'Yuva' gerektiriyorsa ne olur? URL'nizle Socket.getaddrinfo ("www.example.com", "http") 'yazın? –

+0

Belki yerel bir URL kullanıyorsunuzdur. 'Localhost'. '127.0.0.1' ile değiştirmeyi deneyin' –

+0

@padde bu basit bir arama sorgusu gibi görünmüyor - OP 9 iş parçacığı ile çalıştığı ancak 10 ile çalışmadığını belirtti. –

cevap

3

Ben çünkü dişler arasındaki yarış durumun olabileceğini düşünüyorum. Operasyonları atomik olarak yapmaya çalış. Muteks kilidini koy.

@mutex = Mutex.new 

    @mutex.syncronize do 
     ... 

     ary_threads << Thread.start { 
     begin 
     request(job[0],job[1]).each do |ap| #in "request" method, open(url)are called 
      aps.push(ap) 
     end 
     end 
     } 

     ... 
    end