【发布时间】:2013-03-15 22:19:26
【问题描述】:
我制作了一个程序,可以并行解析文本文件和下载数据。在 9 个或更少线程中运行下载方法时,程序没有错误。但是当在 10 个或更多线程中运行该方法时,程序会抛出“`initialize': getaddrinfo: Name or service not known (SocketError)”错误。我尝试了一些算法并行运行,但出现了同样的问题。 我将在发生“名称或服务未知”错误时传递给“open”方法(open-uri)的 url 放入浏览器并确认该 url 有效并接收到正确的数据。这是部分代码。
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
错误是
/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>'
为什么会这样?有没有人遇到过类似的问题? 请帮帮我!
第一个问题后 3 小时,我找到了临时解决方案。 如果我将“请求”方法中的“打开”方法与“开始~救援~重试~结束”夹在中间,则第二次“打开”调用时不会发生错误。这是代码。
begin
response = open(url)
rescue Exception
puts url
puts "retrying"
retry
end
捕获异常并显示url和“retrying”后,永远不会显示url和“retrying”,程序正常运行:) 但是我仍然找不到导致此问题的原因。
【问题讨论】:
-
如果您尝试将
require 'socket'; Socket.getaddrinfo("www.example.com", "http")与您的网址一起使用会怎样? -
也许您使用的是本地 URL,例如
localhost。尝试与127.0.0.1交换 -
@padde 看起来这不是一个基本的查找问题 - OP 提到它适用于 9 个线程但不适用于 10 个线程。
-
@padde 结果是 [["AF_INET", 80, "79.125.115.236", "79.125.115.236", 2, 1, 6], ["AF_INET", 80, "79.125。 115.236", "79.125.115.236", 2, 2, 17], ["AF_INET", 80, "176.34.248.149", "176.34.248.149", 2, 1, 6], ["AF_INET", 80, " 176.34.248.149", "176.34.248.149", 2, 2, 17]] 没有发现什么奇怪的东西。
-
我找到了临时解决方案并添加了代码,所以请看一下。
标签: ruby multithreading sockets getaddrinfo