Ruby ssl`sysread_非块';:已到达文件结尾(EOR)
我已经编写了一个使用ruby线程的代码Ruby ssl`sysread_非块';:已到达文件结尾(EOR),ruby,multithreading,openssl,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] =
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\u nonblock':到达文件结尾(EOFError)
如何克服此问题。您尚未指定hit_mdm()是什么,但考虑到之前的Net::HTTP设置,可能是调用get_response的东西 web上有很多地方可以找到证据证明Net::HTTP可能是线程安全的,尽管没有什么结论 我已经用Net::HTTP和线程做了很多压力测试,我的经验是EOFerror是多个HTTP连接的常见问题。无论是因为服务器、客户机、连接还是Net::HTTP库的原因,都将很难进行调试,特别是使用线程化代码进行TCP通信,从某种意义上说,这也是线程化的 您可以使用wireshark找出EOFError的来源,或者,您可以省去很多麻烦,只需在sysread上解救EOFError(您的回溯可以告诉您将解救放在哪里,因此它只影响Net::HTTP调用,如果EOFError是在那里生成的) 但是如果没有更多的信息,我们无法确切地告诉你为什么会发生EOFError
def getHttp(uri)
begin
http = Net::HTTP.new(uri.host, uri.port)
rescue
p 'failed Net::HTTP.new', uri
retry
end
http
end
根据被否决的答案,我附加了一些代码来显示一个捕获异常示例我在尝试发送电子邮件时遇到了相同的错误,因为Rails应用程序打开了SSL。我在AWS SDK中遇到了相同的问题,并查看了下面的答案。看起来是线程问题让我犯了这个错误。值得庆幸的是,AWS SDK提供了一个“自动加载”功能,可以加载所有模块以确保线程安全。当我自动加载整个SDK而不仅仅是模块时,代码按预期工作。这有点离题,但我希望它能帮助其他遇到EOFError问题的人。两次反对票,没有评论?OP没有详细说明他们的完整代码,但很可能这正是他们遇到的问题,上面Dan Farrell的评论就证明了这一点。谁投了反对票,愿意解释一下吗?