2013-10-10 32 views
1

我有一个外部REST API处理将数据存储在“数据存储”中。多个卷曲会导致Windows上的“打开的文件太多”错误

在文件上传时,它们是一个Ruby库,它调用此API并将其传递给数据数组,然后通过外部API将其存储在数据库中。

我尝试将小数组数组传递给API,以便在任何卷曲调用中限制后主体内容长度。

库调用看起来像这样

def add_data(table_name, table_data) 

    url = "#{ExternalAPI::URL}/addData" 
    m_curl = Curl::Multi.new 

    begin 

    chunks = table_data.each_slice(ExternalAPI::BATCH_SIZE).to_a 

    chunks.each do |data_chunk| 

     data = { 
      "tableName" => table_name, 
      "data"  => data_chunk 
     }.to_json 

     curl = Curl::Easy.new(url) 
     curl.headers = {} 
     curl.headers['Content-type'] = 'text/plain' 
     curl.timeout = 300 
     curl.post_body = data 
     m_curl.add(curl) 
    end 

    m_curl.perform 
    true 

    rescue Exception => e 
    puts "Curl Failed #{e.message}" 
    puts "#{e.backtrace}" 
    Rails.logger.error "Curl Failed #{e.message}" 
    return false 
    end 

end 

这会导致过多的开放连接错误的WEBrick发展模式。 我假设Multi::Curl要么重新连接的连接,但我不知道这是否发生在内部。

我也尝试在for循环中创建一个新的curl连接,并在循环结束时关闭它(我知道它效率低下),但它仍导致相同的错误。

任何人都可以请摆脱这一点?

回答

0

我认为Multi::Curl会尝试同时执行所有连接。您可能需要将它们分批到较小的组中。