由于node运行带有事件循环的单线程模型,我想知道如果编写如下代码,节点如何阻止整个应用程序失败:
while(true){ doSomething()}
其中doSomething是同步函数(阻塞代码片段)
请注意,编写像doSomething这样的函数没有任何意义,但没有什么能阻止你犯错误
如果节点无法阻止这种情况,这是设计错误还是没有办法防止出现这类问题?
这里的问题是,由于它是单线程的,它不允许运行应用程序的任何其他部分(例如,Web服务器将停止接受新连接),因为此功能永远不会结束。在多线程环境中,您将单独松开此线程
答案 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。因此可以对其进行监视,并且可以使用工具重新启动该程序。我不建议这样做,您应该首先修复无限循环,但有时很难找到大型代码库的问题。上次碰巧是我使用了远程调试器来找到无限循环。