我正在设计一个守护进程(特别是Heroku的一个工作进程)和我在ram使用中慢慢累积的代码.它是一个小量(100kb / 10秒),但我知道,对于长期使用这个过程,最好保持ram使用一致.我是新手创建的程
//////////////// // 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实例中提取一些条目,然后它根据这些条目运行预测.
事实证明,Node.js提供了一个很好的函数叫做process.nextTick()来清除调用堆栈(编辑:这可能不是这种情况,但它可以帮助积累事物).通过将我的所有调用包装到其中的worker,我可以防止理论堆栈溢出(这没有发生,但我的内存使用量不断增长).我对这个功能的理解不是很深刻,但它确实做了我一直想做的事情.
(编辑:结果节点通过V8进行FANTASTIC垃圾收集,虽然它以奇怪的间隔运行!)
阅读次数:
> http://mwebhack.blogspot.com/2012/06/careful-with-synchronous-operations-in.html
> http://howtonode.org/understanding-process-next-tick
> http://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback