Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ssl`sysread_非块';:已到达文件结尾(EOR)_Ruby_Multithreading_Openssl - Fatal编程技术网

Ruby ssl`sysread_非块';:已到达文件结尾(EOR)

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] =

我已经编写了一个使用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\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的评论就证明了这一点。谁投了反对票,愿意解释一下吗?