Errno::EBADF:使用ruby net/http的文件描述符不正确

Errno::EBADF:使用ruby net/http的文件描述符不正确,ruby,net-http,Ruby,Net Http,在进行HTTP连接时,什么会导致返回EBADF(错误的文件描述符)。 下面是我创建HTTP连接的代码。虽然现在错误非常少(发生得非常少),但在我将这些错误用于救援之前,我需要了解EBADF的原因 def make_http_request(url, headers={}) uri = URI(url) Net::HTTP.start(uri.host, uri.port) do |http| req = Net::HTTP::Get.new(uri, headers) r

在进行HTTP连接时,什么会导致返回EBADF(错误的文件描述符)。

下面是我创建HTTP连接的代码。虽然现在错误非常少(发生得非常少),但在我将这些错误用于救援之前,我需要了解EBADF的原因

def make_http_request(url, headers={})
  uri = URI(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    req = Net::HTTP::Get.new(uri, headers)
    resp = http.request(req)
    if resp.code.to_i != 200
      logger.error "Retrieve #{resp.code} with #{url} and #{headers}"
      return false
    end
    return resp.body
  end
rescue SocketError, Net::ReadTimeout, Errno::ECONNREFUSED => e
  logger.error "make_http_request #{url} with #{headers} resulted in #{e.message} \n #{e.backtrace}"
  return false
end
我感觉,
connect syscall
正在接收在给定时间点无效的FD。但仍然无法理解这是如何发生的

如果有帮助,代码将用于使用多线程运行的应用程序中

简而言之,上述方法的定义如下

module Eval
  def make_http_request(url, headers={})
    ...
    ...
    ..
  end

  def request_local_endpoint(url, headers)
     response = make_http_request(url, headers)
     response && response.fetch('bravo',nil)
  end

  def request_external_endpoint(url, headers)
    response = make_http_request(url, headers)
    response && response.fetch('token',nil)
  end
end

class RequestBuilder
  include Eval
  attr_reader :data
  def initialize(data)
    @data = data
  end

  def start
    token = request_external_endpoint('http://external.com/endpoint1',{'Content-Type'.freeze => 'application/json', 'Authorization' => 'abcdef'})
    return unless token

    result = request_local_endpoint('http://internal.com/endpoint1',{'Content-Type'.freeze => 'application/json'})
    return result
  end
end

10.times { 
   Thread.new { RequestBuilder.new('sample data').start }
}

你找到解决办法了吗?我也面临同样的问题。