节点如何防止无限循环?

时间:2017-07-06 19:55:03

标签: javascript node.js

由于node运行带有事件循环的单线程模型,我想知道如果编写如下代码,节点如何阻止整个应用程序失败:

while(true){ doSomething()}

其中doSomething是同步函数(阻塞代码片段)

请注意,编写像doSomething这样的函数没有任何意义,但没有什么能阻止你犯错误

如果节点无法阻止这种情况,这是设计错误还是没有办法防止出现这类问题?

这里的问题是,由于它是单线程的,它不允许运行应用程序的任何其他部分(例如,Web服务器将停止接受新连接),因为此功能永远不会结束。在多线程环境中,您将单独松开此线程

3 个答案:

答案 0 :(得分:2)

  

我想知道如果编写一个无限循环,节点如何阻止整个应用程序失败

nodejs不会阻止这种无限循环。它将永远运行该循环或直到某些资源耗尽(如果循环正在消耗某些资源,如内存)。

  

如果节点无法阻止这种情况,这是设计错误还是无法阻止这类问题?

我不认为大多数人认为这是一个设计错误 - 尽管这纯粹是一种意见,不同的人可能会有不同的意见。这是nodejs设计方式的结果,它具有许多其他好处。

防止此类问题的唯一方法是不要编写执行此操作的错误代码。老实说,一旦你意识到这是一个需要避免的问题,就不要太难以避免编写这类代码。

  

这里的问题是,由于它是单线程的,它不允许运行应用程序的任何其他部分(例如,Web服务器将停止接受新连接),因为此功能将永远不会结束。在多线程环境中,您将单独松开此线程

正确。这是您在nodejs中编码时学到的东西。我从来没有觉得要避免这件事是件难事。 nodejs是一个单线程事件驱动系统,而不是一个多线程系统。因此,您使用事件编程,而不是长时间轮询或检查条件的循环。一旦了解了nodejs的工作原理,学习和使用它是一个相当简单的概念。它与其他一些环境不同。但是,如何在nodejs中使用异步操作只是您必须学习在该环境中编程的东西。这是不可避免的,只是nodejs角色的一部分。 nodejs无法拥有它所拥有的架构类型,而无需学习它来编程。如果你想要一个不同的架构(出于个人原因),那么选择一个不同的环境,而不是nodejs。

单线程大大简化了许多其他事情(远远少于竞争条件的机会),并在某些情况下(使用异步I / O)与线程环境相比提高了可伸缩性。对于需要将多个CPU应用于您的问题的情况,node.js中通常可以直接使用内置群集模块或启动工作进程并为其提供工作。数据通常通过某种数据库(基于文件或基于RAM)在多个进程之间共享,这些数据库为您处理大部分多进程同步。

答案 1 :(得分:0)

没有。这似乎不是一个问题,而是一个开放的陈述。节点将无限循环,所有并行代码将停止运行。

答案 2 :(得分:0)

在node.js程序本身中找不到此类问题。但是,具有无限循环的node.js脚本将使用Lead导致100%cpu。因此可以对其进行监视,并且可以使用工具重新启动该程序。我不建议这样做,您应该首先修复无限循环,但有时很难找到大型代码库的问题。上次碰巧是我使用了远程调试器来找到无限循环。