我在文件中有一个非常大的数据列表,我需要处理Node.js中的数据。该列表是一个URL列表,在每个URL上完成的工作本质上是一个请求以及对响应所做的一些工作。
由于执行工作的代码非常大,我只需调用以doWork()
为单位启动它的函数。它需要数据和回调,因此它类似于
function doWork(data, callback)
现在,我正在进行的方式如下:我用以下方式编写了一个queueManager
模块:
var queueManager = {};
queueManager.queue = [];
queueManager.addForProcessing = function (data) {
this.queue.push(data);
};
queueManager.processing = false;
queueManager.startProcessing = function () {
if (!this.processing) {
this.process();
this.processing = true;
}
};
queueManager.process = function () {
var self = this;
if (this.queue.length > 0) {
doWork(this.queue.pop(), function () {
self.process();
});
} else {
this.processing = false;
}
};
module.exports = queueManager;
我将它与readline一起使用:
rl.on('line', function (data) {
queueManager.addForProcessing(data);
queueManager.startProcessing();
});
这样可行,但效果似乎不高。它确实是同步代码。每次处理每一行,并且在处理一行时没有任何事情发生。问题在于,有时候,由于每条线路都有一个请求,每条线路的处理需要一些时间,这会影响应用程序的效率。事实上,带有数据的文件有超过250K的行,所以这很容易成为问题。
现在,为什么我添加了这个队列管理器?因为如果我这样做了:
rl.on('line', function (data) {
doWork(data, function () {
console.log(`${data} has been processed...`);
});
});
该应用程序无效。它开始处理相同的数据时间,并且没有一个处理正确。
我的解决方法有效,但会导致效率问题。
那么在这种情况下,如果我有一个庞大的数据列表,并且我需要处理涉及Web请求等操作的数据,那么我怎么能以比我更有效的方式来做呢? / p>
答案 0 :(得分:1)
您应该看一下群集和工作人员 - https://nodejs.org/api/cluster.html
Node.js的单个实例在单个线程中运行。采取 用户有时希望推出的多核系统的优势 一组Node.js进程来处理负载。
群集模块允许您轻松创建子进程 所有共享服务器端口。
您基本上可以将应用程序拆分为两个进程,并将大数据进程发送到后台。您可以使用消息显示主应用程序进程中的队列状态。
这是关于群集的一个很好的教程 - https://www.sitepoint.com/how-to-create-a-node-js-cluster-for-speeding-up-your-apps/