2012-07-03 131 views
4

我正在設計一個守護進程(特別是Heroku的工作進程)和我已經在RAM內使用緩慢積累的代碼。這是一個很小的數量(100kb/10秒),但我知道爲了長期使用這個過程,最好保持RAM的使用一致。我對創建運行很長時間的流程很陌生,對於在Node和Javascript中開發應用程序仍然很新穎。這裏是我的大部分代碼:內存泄漏Node.js程序

//////////////// 
// Queue Loop // 
//////////////// 
var worker = (function() { 
var buffer = ""; 
var couchdb = http.get({ 
    auth: db_user + ":" + db_pass, 
    host: db_host, 
    path: '/queue/_all_docs?include_docs=true', 
    port: db_port 
}, function(response) { 
    response.setEncoding('utf8'); 

    response.on("data", function(data) { 
     buffer += data; 
    }); 

    response.on("end", function() {   
     var queue = JSON.parse(buffer); 

     if (!queue.error) { 

      buffer = ""; 
      couchdb = http.get({ 
       auth: db_user + ":" + db_pass, 
       host: db_host, 
       path: '/flights/_all_docs?include_docs=true', 
       port: db_port 
      }, function(response) { 
       response.setEncoding('utf8'); 

       response.on("data", function(data) { 
        buffer += data; 
       }); 

       response.on("end", function() { 
        var flights = JSON.parse(buffer); 

        if (!flights.error) { 
         for (row in queue.rows) { 
          console.log(queue.rows[row].doc.flight); 
         } 

      for (row in flights.rows) { 
       console.log(flights.rows[row].doc.program); 
       } 

       setTimeout(worker, 10000);  
      } else { 
       // db error 
      } 
      }); 
     }).on("error", function() { 
      setTimeout(worker, 10000);  
     }); 
      } else { 
       // db error 
      } 
     }); 
    }).on("error", function() { 
     console.error("CouchDB is currently not available."); 
     setTimeout(worker, 10000); 
    }); 
}); 



/////////////// 
// Run Queue // 
/////////////// 
(function() { 
    worker(); 
})(); 

所以這一說法,是什麼讓這樣用相同量的RAM的不斷運行的程序的最佳方式?還有哪些其他設計考慮因素對於保持這種運行狀態足以在Heroku上充當工作進程至關重要?

哦,至於它做了什麼,它會從CouchDB實例中提取一些條目,然後根據這些條目運行預測。

回答

3

事實證明,Node.js提供了一個很好的函數process.nextTick(),清除了調用堆棧(編輯:這可能不是這種情況,但它有助於積累)。通過將我所有的調用包裝到工作中,我可以防止理論堆棧溢出(這種情況沒有發生,但是我的內存使用量不斷增加)。

我對這個功能的理解不是很深,但它做我一直想做的事情。

(編輯:!輪番出節點已通過V8 FANTASTIC垃圾收集,它在奇怪的時間間隔運行雖然)

閱讀次數: