【问题标题】:What happens if you are simultaneously modifying an array that you are looping through in node js?如果您同时修改在节点 js 中循环的数组,会发生什么?
【发布时间】:2017-06-21 12:16:21
【问题描述】:

我是 node js 的新手,刚刚习惯了这种语言的异步特性...

我有一个函数,它每 60 秒更新一次数组 A 中的值(从数据库中获取它们)。

我还有一个处理来自用户的请求的函数,在处理这些请求时,它使用来自 A 的值(因此我循环遍历 A)。

我想知道这种异步操作是否会使我的应用崩溃?

例如,如果我正在循环 A 并获取值,但同时,60 秒计时器会命中并开始更新 A 中的值strong>,会不会有什么不好的事情发生?

如果是这样,您有什么设计建议可以避免这种情况吗?

非常感谢您的帮助!

【问题讨论】:

  • 异步并不意味着多线程 - 所以当您同步循环通过 A 时,任何会导致 A 更改的“事件”都不会运行直到你的同步代码完成
  • 如果您在代码中包含特定的代码示例,您将获得更具体和更有意义的答案。并发问题取决于确切的代码,不能仅从您的文本描述中确定。

标签: javascript arrays node.js loops


【解决方案1】:

这实际上取决于您的确切代码,因此如果不查看和理解您的确切代码,就无法提供具体答案。

node.js 中的 Javascript 是单线程的,因此如果您使用同步机制(例如 .forEach()for 循环)遍历数组,那么您进行的任何异步调用都将被启动,但它们无法完成,直到在您当前的执行线程(包括通过数组的循环)完全完成之后。因此,当您仍在循环时,任何异步结果都不会影响数组。

遍历数组的方式不那么传统和异步。如果您使用其中之一,我们必须查看您的实际代码才能就您是否有任何并发​​问题提供意见。

例如,如果我正在循环 A 并获取值 但与此同时,60 秒计时器响起并开始更新 A中的值,会发生什么不好的事情吗?

node.js 是事件驱动的。这意味着当计时器准备好触发时,它会将一个事件插入到 node.js 事件队列中。在当前运行的 Javascript 完成之前,不会处理该事件,并且 node.js JS 引擎可以将下一个事件拉出事件队列。因此,计时器永远不会中断您当前正在运行的 Javascript。

【讨论】:

    【解决方案2】:

    您可能会因为这样做而遇到奇怪的错误。如果您在 A 中间并且 A 变得更短,它将终止循环。例如,假设 A 有 30 个元素。但是,当您在循环时,当您在索引 16 上时,它会更改为长度 15。它不会继续循环。另一个例子。假设 A 的长度为 2。当你完成第一个索引的内容时,当你转到第二个时,两个索引的值都发生了变化,那么第一个将被报告为旧值,第二个被报告为新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2013-06-04
      • 2016-05-14
      相关资源
      最近更新 更多