编程语言
首页 > 编程语言> > JavaScript中的数据竞赛?

JavaScript中的数据竞赛?

作者:互联网

假设我运行这段代码.

var score = 0;
for (var i = 0; i < arbitrary_length; i++) {
     async_task(i, function() { score++; }); // increment callback function
}

从理论上讲,我理解这会导致数据争用,并且试图同时增加两个线程可能会导致单个增量,但是,已知nodejs(和javascript)是单线程的.我是否可以保证score的最终值将等于random_length?

解决方法:

节点使用事件循环.您可以将其视为一个队列.因此,我们可以假设您的for循环放入了function(){score; }在此队列上回调random_length次.之后,js引擎逐个运行这些引擎,并每次增加得分.是的唯一的例外是未调用回调或从其他地方访问了score变量.

实际上,您可以使用此模式并行执行任务,收集结果并在完成每个任务时调用单个回调.

var results = [];
for (var i = 0; i < arbitrary_length; i++) {
     async_task(i, function(result) {
          results.push(result);
          if (results.length == arbitrary_length)
               tasksDone(results);
     });
}

标签:javascript,multithreading,node-js,race-condition
来源: https://codeday.me/bug/20191013/1904981.html