Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以通过在事件队列上放置一个长时间运行的进程来挂起Node.js?_Javascript_Node.js - Fatal编程技术网

Javascript 是否可以通过在事件队列上放置一个长时间运行的进程来挂起Node.js?

Javascript 是否可以通过在事件队列上放置一个长时间运行的进程来挂起Node.js?,javascript,node.js,Javascript,Node.js,我正在向面试官演示事件队列的工作,突然,他问我,如果调用堆栈上有一个长时间运行的进程,该怎么办?那会永远挂起Node.js吗 据我所知,这应该是我告诉他的,因为我在写一些坏的无限循环方面有一些经验,这些循环冻结了我的Chrome和所有 然后他反驳我说,在一个被成千上万的公司用于生产系统的平台上,这是否是一个理想的功能?老实说,我被难倒了 有人能解释一下吗?对于您的问题:是的,通过在事件队列上放置一个长时间运行的进程,可以挂起节点 您可以在此处阅读一些信息: 默认情况下,节点有1个主线程运行事件循

我正在向面试官演示事件队列的工作,突然,他问我,如果调用堆栈上有一个长时间运行的进程,该怎么办?那会永远挂起Node.js吗

据我所知,这应该是我告诉他的,因为我在写一些坏的无限循环方面有一些经验,这些循环冻结了我的Chrome和所有

然后他反驳我说,在一个被成千上万的公司用于生产系统的平台上,这是否是一个理想的功能?老实说,我被难倒了


有人能解释一下吗?

对于您的问题:是的,通过在事件队列上放置一个长时间运行的进程,可以挂起节点

您可以在此处阅读一些信息:

默认情况下,节点有1个主线程运行事件循环,4个工作线程运行I/O、OS和异步任务。因此,如果您的代码在事件循环中运行的时间太长,您的应用程序看起来会挂起

例如:

function doWork(duration) {
    const start = Date.now();
    while (Date.now() - start < duration) {
    }
}

app.get('/', (req, res) => {
    doWork(10000);
    res.send('Hello world');
})

app.get('/hi', (req, res) => {
    res.send('Hi');
});
功能工作(持续时间){
const start=Date.now();
while(Date.now()-开始<持续时间){
}
}
应用程序获取(“/”,(请求,请求)=>{
嫁妆(10000);
res.send(“你好世界”);
})
应用程序获取('/hi',(请求,请求)=>{
res.send('Hi');
});
在这种情况下,如果您向第一个路由器发出请求,然后向第二个路由器发出请求。第二个请求必须等待第一个请求完成后才能发送响应。所以它将被挂起10秒

对于工人案例,如果所有4名工人仍然没有完成他们的任务,第5项任务即将到来,则必须等到其中一名工人完成。因此,如果4名工人花了很长时间来运行他们的工作,那么第5项工作将永远无法完成。你可以增加工人的数量,但也有不利的一面。每个人完成任务可能需要更长的时间

所以对于节点,它不应该用于CPU密集型任务,而应该用于API网关、处理I/O任务等。。。每件事都有自己的用过的,视情况而定,我们可以有解决的办法。在您上传文件的情况下,我们可以对文件上传进行一些限制,或者您的应用程序节点仅用于验证数据,而不是与其他应用程序握手以上传文件


对于拥有自己IT部门的数千家公司来说,我认为他们已经知道在他们的情况下使用Node的优势和劣势。

很简单,任何浏览器基本上都有一个“kill tab”功能,可以终止特定的选项卡。因此,现在即使你已经挂起了chrome,你也可以取消特定的标签。这反过来只会妨碍您的网页,并让其他页面/选项卡正常运行。总有一种方法可以挂起服务器/进程/连接,就像执行长/循环数据库查询,如果没有连接超时,则会挂起数据库。。。但是,您可以设置连接超时/查询超时,然后修复它。所以我想这没什么好害怕的。但是如果你有一个public Node.js服务器,有人提交一个长时间运行的过程,比如一个非常大的文件上传等等,你会怎么做?在生产中如何处理这种情况?在这些情况下,上传文件的大小总是有限制的,在其他情况下也可以处理同样的情况。看看。我以为你是从其他网站用户的角度讲的。保护您自己的服务器不受此类操作影响的方法有很多,例如限制文件大小(每个人都这样做,并且不特定于node.js)、请求超时(同样也不特定于node.js)、利用事件、承诺和流,因为它们是异步的,不会阻止其他执行。