我们是否应该在NodeJS中一直避免正常的for-loop来提高并发性?

比方说,我有一个非常简单的演示function,在一个路线之一

let array = []; for (var i = 0; i < 1000; i++) { array[i] = i * 10; } 

这将是一个非常快的循环。 但是使用async.each(...)把这个过程变成asynchronous循环会async.each(...)

我是否应该一直避免正常的for循环,并尝试将所有循环转换为asynchronous?

这就是说,我一直在使用underscore.each在我的项目中,现在我打算把所有的东西都转换成async.each,不pipe这个循环有多简单。

将所有for循环转换forasynchronous操作是矫枉过正的。

我在编程中遵循的一个规则是尽可能简单地编写代码,并且只在需要的时候增加复杂性来解决你已经certificate需要的问题,甚至当你找不到另一个简单的方法来解决问题的时候。 所以,不要花费时间和代码来优化你没有足够分析的事情,知道你确实有一个需要解决的问题。

所以,在你的具体情况下,你需要发现你有一个特定for循环,这是花费太长的时间,因此搞乱了你的服务器的响应能力,只能在特定for循环中工作。

certificate这将涉及:

  1. 认识到你有一个实际的服务器响应问题。 不需要添加代码来解决实际上没有的问题。

  2. 分析您的代码,找出实际存在的瓶颈。 他们往往不是你想象的那样,所以你必须测量,以获得有关瓶颈的数据。

  3. 从结构上决定处理这些瓶颈的最好方法是什么。 例如,在4 CPU系统上使用4个进程的node.js集群可能会更好。 或者,您可能会更好地实施自定义进程和工作队列,以便在单独的进程中处理CPU密集型任务。 这完全取决于要完成的工作的具体情况 – 对于如何缩放或处理负载,没有单一的通用答案。

在低级伪代码中,同步循环如下所示:

  • 检查停止情况
  • 运行内部代码
  • 重复

asynchronous版本:

  • 检查停止情况
  • 运行内部代码
  • 控制其他任务
  • 等待控制权归还给我们
  • 重复

如果你正在执行一个超强度的计算任务,并担心在你的循环运行期间其他任务可能被阻塞,偶尔产生控制是有意义的。

如果运行循环是你的程序唯一或最重要的事情; 或者如果整个迭代花费很less时间,则只会增加开销并降低性能。

你给的例子正好落入第二类。 你的循环很简单,整个迭代需要很less的时间。 您不可能阻止其他任务在您的Node进程中运行。 在循环中没有理由得到控制,在每一次迭代中都less得多。 你只会让这个过程花费更长的时间。

只有在需要同时处理多个任务的情况下才使用asynchronous工具,否则,同步循环将阻止其余的运行。 通常情况并非如此。 使它成为例外。

虽然我不认为在所有循环中使用async.each会有什么不好,但除非for循环中的操作在每次迭代中花费很长时间,否则可能不是必须的。 在这个例子中,将数字相乘并插入到数组中几乎不会花费时间,所以使用async.each重写它可能不会对性能造成太大的影响。

我是否应该一直避免正常的for循环,并尝试将所有循环转换为asynchronous?

不,如果整个循环快速完成,那么这是不必要的。

这有点像问你是否应该用setTimeout( function ( ) { // statement }, 0 );来包装每一条setTimeout( function ( ) { // statement }, 0 ); 给事件循环一个机会来处理I / O。

如果您希望允许在循环中处理I / O,则可以执行的最佳操作是运行多个进程,以便操作系统可以处理调度并尽可能使用多个内核。