Ho creato un programma che analizza il file di testo e scarica i dati in parallelo. Quando si esegue il metodo di download in 9 o meno thread, il programma non ha errori. Ma quando si esegue il metodo in 10 o più thread, il programma lancia "errore di inizializzazione: getaddrinfo: Nome o servizio non noto (SocketError)". Ho provato alcuni algoritmi per eseguire in parallelo, ma lo stesso problema si verifica. Inserisco l'url, che è stato passato al metodo "open" (open-uri) quando "Nome o servizio sconosciuto" si verifica, nel browser e conferma che questo URL è valido e ha ricevuto dati corretti. Il codice parziale.Errore "Nome o servizio non noto (SocketError)" quando viene eseguito in molti thread
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
e l'errore è
/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>'
Perché accade questo? Qualcuno ha riscontrato un problema simile? Per favore aiutatemi!
3 ore dopo la prima domanda, ho trovato una soluzione temporanea. Se ho inserito il metodo "open" nel metodo "request" con "begin ~ rescue ~ retry ~ end", l'errore non si verifica quando la seconda volta "open" viene chiamato. Ecco il codice.
begin
response = open(url)
rescue Exception
puts url
puts "retrying"
retry
end
Dopo la cattura delle eccezioni e la visualizzazione di URL e "riprovare", l'URL e "riprovare" non sarà mai visualizzato e il programma funziona correttamente :) Ma ancora non riesco a trovare ciò che provoca questo problema.
Cosa succede se si prova 'require 'socket'; Socket.getaddrinfo ("www.example.com", "http") 'con il tuo URL? –
Forse stai utilizzando un URL locale, ad es. 'Localhost'. Prova a scambiare con '127.0.0.1' –
@padde non sembra che questo sia un problema di ricerca di base - l'OP ha detto che funziona con 9 thread ma non con 10. –