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