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。