Zrobiłem program, który analizuje plik tekstowy i pobiera dane równolegle. Po uruchomieniu metody pobierania w 9 lub mniej wątków program nie zawiera błędów. Ale gdy uruchamia metodę w 10 lub więcej wątkach, program zgłasza błąd "` initialize ": getaddrinfo: Name lub service not known (SocketError)". Próbowałem uruchomić kilka algorytmów równolegle, ale występuje ten sam problem. Umieściłem adres URL, który został przekazany do metody "otwartej" (open-uri), gdy wystąpił błąd "Nazwa lub usługa nieznana", do przeglądarki i potwierdził, że adres URL jest prawidłowy i otrzymał poprawne dane. Oto częściowy kod.Błąd "Nazwa lub usługa nieznana (SocketError)", gdy działa w wielu wątkach
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
i błędów jest
/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>'
Dlaczego tak się dzieje? Czy ktoś napotkał podobny problem? Proszę, pomóżcie mi!
3 godziny po pierwszym pytaniu znalazłem rozwiązanie tymczasowe. Jeśli zastosowałem metodę "otwartą" w metodzie "request" z "begin ~ rescue ~ retry ~ end", błąd nie występuje, gdy po raz drugi wywołano "open". Tutaj jest kod.
begin
response = open(url)
rescue Exception
puts url
puts "retrying"
retry
end
Po połowu wyjątek i wyświetlanie url i „powtórzeń”, URL i „powtórzeń” nigdy nie będą wyświetlane, a program działa poprawnie :) Ale nadal nie mogę znaleźć co powoduje ten problem.
Co się stanie, jeśli spróbujesz użyć 'require 'socket'; Socket.getaddrinfo ("www.example.com", "http") 'z twoim adresem URL? –
Może używasz lokalnego adresu URL, np. 'localhost'. Spróbuj zamienić na "127.0.0.1" –
@padde nie wygląda na to, że jest to podstawowy problem wyszukiwania - OP wspomniał, że działa z 9 wątkami, ale nie z 10. –