节点可以防止无限循环吗?



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

while(true){ doSomething()}

其中doSomething是一个同步函数(一段阻塞代码(

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

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

节点可以为您做些什么来防止此类问题吗?

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

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

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

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

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

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

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

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

它没有。这似乎不是一个问题,而是一个开放的声明。Node 将无限循环,所有并行代码将停止运行。

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

最新更新