javascript - Node.js 异步 forEach : thread-safe?

标签 javascript node.js multithreading asynchronous async.js

我有一个(也许是微不足道的)问题。我正在使用 Node.js 包 async,特别是 async.each 方法 ( https://github.com/caolan/async#forEach )。

考虑以下代码:

var arrayOne=[];

async.forEach(arrayTwo, 
  function (item, callback){ 
    arrayOne.push(item); // push into arrayOne
    callback(); // the iterator has completed
  }, function(err) {
   // do something with arrayOne
}); 

arrayOne.push(item) 安全吗?

最佳答案

所以这个答案有点微妙。对于这种确切的情况,您最终将得到 arrayOnearrayTwo 具有相同顺序的相同项目,但这更多是示例代码不被执行的副作用。真正的异步并且 async.forEach 没有做任何过于意外/聪明的事情。但是,为了使其真正可靠,您需要使用保证顺序的 async 函数,而 .forEach/.each 合约的字母则不然。 .each 仅保证对 arrayTwo 中的每个项目调用工作函数一次。它不保证它将按顺序启动它们,或者在启动下一个之前等待一个完成,等等。例如,如果 async 的作者决定以相反的顺序启动工作函数以进行某些性能优化,那么情况就会改变你的副作用。因此,最好不要依赖超出异步函数定义/文档中明确保证的任何行为。因此,使用像async.series这样的东西会给你一个可靠的方法来做到这一点,并且最后不会在arrayOne中得到意外的顺序。当然,现在的并行特性有很大不同。

但是,从技术 Angular 来看,这一切都不涉及“线程安全”的概念,因为 Node 只有一个执行线程。然而,在处理这样的异步代码时,您最终会考虑相同类型的竞争条件,因此最终您可以在 Node 中编写竞争条件,就像在多线程语言中一样。

我记得最有帮助的类比是异步代码是通过送货订购食物。如果您调用 3 家餐厅并从每家餐厅订购一份披萨,这并不意味着送货到您家门口的顺序是什么。

关于javascript - Node.js 异步 forEach : thread-safe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555777/

相关文章:

javascript - 使用 jQuery 定位 div 中的类并在同一 div 中执行其他更改

javascript - 删除 Cookie

javascript - 如何使用 Google Closure 编译器

node.js - 如何在 DigitalOcean 上找到您的私有(private) IP 地址?

c++ - 我如何 "clear"std::promise?

javascript - Javascript中的 "button is null"是什么意思?

node.js - 无法从 Firebase 检索文档列表

node.js - EACCES : permission denied with Node JS

java - Volley API 是线程安全的吗?

java - 在java中并行处理数组