async.auto中的竞争条件

时间:2014-04-15 05:06:46

标签: javascript node.js asynchronous race-condition

我正在使用async.each,如下所示:

async.each(students, plan(student, callback), function(err) {
.....
.....
});
plan(student, callback){
    ......
    ......
    commonDS[student.id] = student.name;
}

这里commonDS是函数调用中常见的数据结构,所以这里有竞争条件吗?

1 个答案:

答案 0 :(得分:1)

简短回答:可能不是。

更长的答案:Node.js是单线程的,因此每个同步代码块都是原子的。特别是没有线程,实际上没有并发(一切都按顺序运行)。因此,在同步代码块上没有竞争条件。

虽然总体上存在竞争条件。例如,假设您拥有commonDS字典。现在,您发出异步请求以加载数据X,然后执行commonDS[key] = X。然后,对于X,您进行另一个异步请求(加载其他数据),然后执行commonDS[key].my_attr = Y。你这里有竞争条件。那是因为你不知道你改变了哪个X对象(因为你链接了异步请求)。您最终可能会错误填充对象。

因此,为了确保我们需要了解async.each(或通常在其他地方)发生的事情。

请注意,Node.js中没有锁定对象,因此如果您需要它,您可以自己实现它(由于Node.js是单线程的,因此并不困难)或使用现有库中的一个。