ssl`sysread_nonblock':到达文件结尾(EOFError)

时间:2013-09-12 05:08:45

标签: ruby multithreading openssl

我编写了一个使用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:在`sysread_nonblock'中:到达文件末尾(EOFError)

如何克服这个问题。

2 个答案:

答案 0 :(得分:0)

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

基于downvoted回答,我附上了一些代码来显示一个catch异常示例

答案 1 :(得分:-1)

你还没有指定hit_mdm()是什么,但可能是考虑到之前的Net :: HTTP设置而调用get_response的东西。

网上有很多地方你可以找到Net :: HTTP 可能线程安全的证据,但没什么结论。

我使用Net :: HTTP和线程进行了大量压力测试,我的经验是EOFErrors是多个HTTP连接的常见问题。是否由于服务器或客户端或连接或Net :: HTTP库将要发生非常难以调试,特别是使用执行TCP通信的线程代码,这也是线程化的,从某种意义上说。

你可以使用wireshark来弄清楚EOFError的来源,或者,你可以省去很多头痛并且只是在sysread上救出EOFError(你的回溯可以告诉你在哪里进行救援所以它只会影响Net :: HTTP调用,如果那是生成EOFError的地方。

但是如果没有更多信息,我们无法确切地告诉你为什么EOFError肯定会发生。