这是Heroku上的节点js worker:
var Worker = require('./worker.js')
...
Worker.performJob(data) //data is a small object with just 3 attributes
worker.js:
var Worker = {}
Worker.performJob = function (data) {
//read lots of data into memory, call other functions with this data as parameters
var hugeData = readFromDb()
Worker.processStuff(hugeData)
}
Worker.processStuff = function (hugeData) {
...
}
module.exports = Worker
工作人员一遍又一遍地监听某些事件并开始处理数据。 随着时间的推移,工作者使用的内存会增长 - 当performJob()完成时,它不会被释放,即使所有巨大的变量都是本地的。 本文http://www.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/暗示它可能是因为Worker全局变量,它保留了对函数的引用。
如何编写工人以避免这种情况?
UPDATE 我通过在同一个.js文件中移动函数来改变了worker。现在它读取
performJob(data)
function performJob(data) {
//read lots of data into memory, call other functions with this data as parameters
var hugeData = readFromDb()
processStuff(hugeData)
}
function processStuff(hugeData) {
...
}
但是,每次执行任务后内存都会增长,并在空闲时保持该级别(如https://devcenter.heroku.com/articles/log-runtime-metrics所示),然后在另一项任务后再次增长......