6

我编写了一个使用 ruby​​ 线程的代码。

require 'rubygems'
require 'net/http'
require 'uri'

def get_response()

  uri = URI.parse('https://..........')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  -----
  -----
end

t1 = []
15.times do |i|
t1[i] = Thread.new{
hit_mdm(i)
sleep(rand(0)/10.0)
}
end

t1.each {|t| t.join}

该代码工作正常,但是当程序到达其末尾时,它会引发以下错误:

ruby/2.0.0/openssl/buffering.rb:174:in `sysread_nonblock': 到达文件结尾 (EOFError)

如何克服这个问题。

4

2 回答 2

0
def getHttp(uri)
    begin       
        http = Net::HTTP.new(uri.host, uri.port)        
    rescue
        p 'failed Net::HTTP.new', uri
        retry       
    end
    http
end 

基于被否决的答案,我附上了一些代码来显示一个捕获异常示例

于 2016-03-03T15:24:03.153 回答
-1

您尚未指定 hit_mdm() 是什么,但考虑到您之前的 Net::HTTP 设置,大概是调用 get_response 的东西。

网络上有很多地方可以找到 Net::HTTP可能是线程安全的证据,尽管没有任何结论。

我用 Net::HTTP 和线程做了很多压力测试,我的经验是 EOFErrors 是多个 HTTP 连接的常见问题。无论是由于服务器、客户端、连接还是 Net::HTTP 库而发生的,都将非常难以调试,尤其是使用执行 TCP 通信的线程代码,从某种意义上说,它也是线程的。

您可以使用 wireshark 找出 EOFError 的来源,或者,您可以省去很多麻烦,只需在 sysread 上拯救 EOFError (您的回溯可以告诉您将救援放在哪里,所以它只会影响网络: :HTTP 调用,如果这是生成 EOFError 的地方)。

但是如果没有更多信息,我们无法真正告诉您为什么 EOFError 肯定会发生。

于 2013-10-16T00:03:37.327 回答