如何同时编写流并读取node.js中的数据?

时间:2013-04-02 14:25:29

标签: node.js concurrency stream

我有一个node.js流,我暂时写入这样的数组:

var tempCrossSection = [];

stream.on('data', function(data) {
    tempCrossSection.push(data);
});

然后我定期获取该数组中的数据(并清除它)并对其进行一些处理,如下所示:

var crossSection = [];

setInterval(function() {
    crossSection = tempCrossSection;
    tempCrossSection = [];

    someOtherFunction(crossSection, function(data) {
        console.log(data);
    }
}, 30000);

问题是我得到一些奇怪的行为,其中流被写入数组的顺序以及当流速增加和/或someOtherFunction回调花费太长时触发的setInterval回调数。

我应该如何实现这一点,以便流正确地将数据写入数组(按顺序),并且每个setInterval回调进行一次数据处理。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。首先,你要与很多州分享。 例如,crossSection应该只在匿名Interval函数中定义。 为什么“crossSection”被定义为闭包?如果someOtherFunction运行很长一段时间,你可能确实遇到了某种竞争条件。

var source = [];

stream.on('data', function(data) {
    source.push(data);
});

setInterval(function() {
    var target = source;
    source = [];

    someOtherFunction(target, function(data) {
        console.log(data);
    }
}, 30000);

如果您可以访问 someOtherFunction ,那么我会重写像这样的整个事情

var source = [];

stream.on('data', function(data) {
    source.push(data);
});

setInterval(function() {
    var processing = true;

    while (processing) {
        var elem = source.shift();
        someOtherFunction(elem, function(data) {
            console.log(data);
        });
        processing = checkForBreakConditionAndReturnFalseIfBreak();
    }
}, 30000);

如果元素数量大到 someOtherFunctions 需要很长时间,你可能会遇到一些问题。所以我可能会做这样的事情

var source = [];
var timerId = 0;

stream.on('data', function(data) {
    source.push(data);
});

function processSource() {
    clearTimeout(timerId);
    var processing = true;

    while (processing) {
        var elem = source.shift();
        someOtherFunction(elem, function(data) {
            console.log(data);
        });
        processing = checkForBreakConditionAndReturnFalseIfBreak();
    }
    setTimeout(processSource, calcTimeoutForNextProcessingDependentOnPastData());
};

setTimeout(processSource, 30000); //initial Timeout