我一直在使用open_uri
拉下 ftp 路径作为数据源一段时间,但突然发现我几乎连续不断地收到“530 抱歉,已连接允许的最大客户端数 (95)”。
我不确定我的代码是否有问题,或者是否是其他人正在访问服务器,不幸的是,我似乎无法真正确定谁有问题。
本质上我正在读取 FTP URI:
def self.read_uri(uri)
begin
uri = open(uri).read
uri == "Error" ? nil : uri
rescue OpenURI::HTTPError
nil
end
end
我猜我需要在这里添加一些额外的错误处理代码......
我想确保我采取一切预防措施关闭所有连接,以便我的连接不是有问题的问题,但是我认为 open_uri + read 会采取这种预防措施而不是使用 Net::FTP 方法。
最重要的是,我必须 100% 确定这些连接正在关闭,并且我周围没有一堆打开的连接。
有人可以建议如何正确使用 read_uri 拉入 ftp 并保证它关闭连接吗?或者我应该将逻辑转移到 Net::FTP,如果 open_uri 不够强大,这可以对情况产生更多控制?
如果我确实需要使用 Net::FTP 方法,是否有一种我应该熟悉的读取方法 vs 将其拉到临时位置然后读取它(因为我更愿意将其保留在缓冲区中)如果可能的话 vs fs)?
我怀疑你没有关闭手柄。OpenURI 的文档 http://rubydoc.info/stdlib/open-uri/frames从这个评论开始:
It is possible to open http/https/ftp URL as usual like opening a file:
open("http://www.ruby-lang.org/") {|f|
f.each_line {|line| p line}
}
我查看了来源和open_uri
如果您传递一个块,方法会关闭流,因此,调整上面的示例以适合您的代码:
uri = ''
open("http://www.ruby-lang.org/") {|f|
uri = f.read
}
应该让你接近你想要的。
这是处理异常的一种方法:
# The list of URLs to pass in to check if one times out or is refused.
urls = %w[
http://www.ruby-lang.org/
http://www2.ruby-lang.org/
]
# the method
def self.read_uri(urls)
content = ''
open(urls.shift) { |f| content = f.read }
content == "Error" ? nil : content
rescue OpenURI::HTTPError
retry if (urls.any?)
nil
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)