【发布时间】:2015-01-30 05:15:17
【问题描述】:
我很难考虑让 node.js 进程(异步)运行但仍触发“退出”状态,以便在 CPU 运行完成后我可以做更多事情。
例如,我有一个 Google Places 爬虫,它可以在所有可用的 CPU 上高效地分发 http 请求。
} else if (cluster.isWorker) {
// Code to run if we're in a worker process
// Send the object we created above from variables so they're available to the workers
process.on('message', function(clusterDivisionObject) {
var tempArray;
// Send the chunk of array appropriate for this cluster to process, then request it's place details
tempArray = clusterDivisionObject.placeIdArray.splice(((cluster.worker.id * clusterDivisionObject.clusterDivision) - clusterDivisionObject.clusterDivision), clusterDivisionObject.clusterDivision);
tempArray.forEach(function(arrayItem, index, array){
request({url: config.detailsRequestURI + '?key=' + config.apiKey + '&placeid=' + arrayItem, headers: config.headers}, detailsRequest);
});
});
}
这里真正的问题是我发送异步request() 语句的最后一行。代码正确执行,但是一旦我点击回调 (detailsRequest) 做某事(在这种情况下,写入一个 json 文件),我就无法控制退出进程。我的回调函数:
function detailsRequest(error, response, body) {
if (!error && response.statusCode == 200) {
var detailsBody = JSON.parse(body);
...
}
}
...不知道什么进程正在运行它或它进行了多少次迭代(在整个tempArray 用尽后触发退出)。那么,假设一个集群正在运行request() for x 长度的tempArray,我如何在tempArray.forEach(){} 完成时触发process.exit(0)?
我尝试在 tempArray.forEach(){} 之后直接调用 process.exit(0),但在 request() 甚至运行之前进程就会死掉。 是否有任何有效的方法可以让我更好地观察进程以将其称为退出,或者我是否真的在尝试解决由于request() 是异步的并且可以按任何顺序调用或不调用而无法存在的问题?
【问题讨论】:
标签: javascript node.js asynchronous