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

vis*_*shB 6 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}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但是当程序到达终点时,它会抛出以下错误:

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

如何克服这个问题.

Dav*_*lar -1

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

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

我已经对 Net::HTTP 和线程进行了大量压力测试,我的经验是 EOFErrors 是多个 HTTP 连接的常见问题。无论是由于服务器、客户端、连接还是 Net::HTTP 库而发生这种情况,调试起来都非常困难,特别是使用进行 TCP 通信的线程代码,从某种意义上来说,这也是线程的。

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

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