我正在使用async.each
,如下所示:
async.each(students, plan(student, callback), function(err) {
.....
.....
});
plan(student, callback){
......
......
commonDS[student.id] = student.name;
}
这里commonDS
是函数调用中常见的数据结构,所以这里有竞争条件吗?
答案 0 :(得分:1)
简短回答:可能不是。
更长的答案:Node.js是单线程的,因此每个同步代码块都是原子的。特别是没有线程,实际上没有并发(一切都按顺序运行)。因此,在同步代码块上没有竞争条件。
虽然总体上存在竞争条件。例如,假设您拥有commonDS
字典。现在,您发出异步请求以加载数据X
,然后执行commonDS[key] = X
。然后,对于X
,您进行另一个异步请求(加载其他数据),然后执行commonDS[key].my_attr = Y
。你这里有竞争条件。那是因为你不知道你改变了哪个X
对象(因为你链接了异步请求)。您最终可能会错误填充对象。
因此,为了确保我们需要了解async.each
(或通常在其他地方)发生的事情。
请注意,Node.js中没有锁定对象,因此如果您需要它,您可以自己实现它(由于Node.js是单线程的,因此并不困难)或使用现有库中的一个。