gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:40:26 25 4
gpt4 key购买 nike

我有一个(也许是微不足道的)问题。我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com