gpt4 book ai didi

node.js - 使用递归process.nexttick是否可以使其他进程或线程正常工作?

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:58 24 4
gpt4 key购买 nike

从技术上讲,当我们执行以下代码(递归process.nexttick)时,CPU使用率将达到100%或接近100%。问题是想象我正在一台具有一个CPU的计算机上运行,​​并且节点HTTP服务器还有另一个进程在工作,这对它有何影响?

进行递归process.nexttick的线程是否完全允许HTTP服务器工作?

如果我们有两个递归process.nexttick线程,它们是否都获得50%的份额?

因为我不知道任何具有一个内核的机器都不能尝试。而且由于在这种情况下我对线程之间的CPU时间共享的理解是有限的,所以我不应该在具有4个CPU内核的机器上尝试使用它。

function interval(){
process.nextTick(function(){
someSmallSyncCode();
interval();
})
}

谢谢

最佳答案

要了解这里发生了什么,您必须了解有关节点事件循环以及操作系统和CPU的一些知识。

首先,让我们更好地理解此代码。您称此为递归,但是吗?

在递归中,我们通常会想到嵌套的调用堆栈,然后在完成计算(达到基本情况)后,堆栈“展开”回到调用递归函数的位置。

尽管这是一种自行调用的方法(通过回调间接调用),但事件循环使实际发生的事情产生了歪斜。

process.nextTick将一个函数用作回调,并将其放在事件循环的下一个循环中要完成的工作 list 中。然后执行该回调,完成后,您将再次注册相同的回调。从本质上讲,此递归与真正递归之间的主要区别在于,我们的调用堆栈永远不会超过一个调用深度。我们从不“放松”堆栈,我们只是连续有很多小的短堆栈。

好吧,为什么这很重要?

当我们更好地了解事件循环以及实际情况时,我们可以更好地了解系统资源的使用方式。通过以这种方式使用process.nextTick,您可以确保在事件循环中总有事情要做,这就是为什么您会获得较高的CPU使用率(但您已经知道这一点)的原因。现在,如果我们假设您的HTTP服务器以脚本的形式在SAME进程中运行,如下所示

function interval(){
process.nextTick(doIntervalStuff)
}

function doIntervalStuff() {
someSmallSyncCode();
interval();
}

http.createServer(function (req, res) {
doHTTPStuff()
}).listen(1337, "127.0.0.1");

那么如何在程序的两个不同部分之间分配CPU使用率呢?多数民众赞成在很难说,但如果我们了解事件循环,我们至少可以猜测。

由于我们使用process.nextTick,因此doIntervalStuff函数将在事件循环的“开始”处每次运行,但是,如果要对HTTP服务器做一些事情(例如处理连接),那么我们知道它将得到在下次事件循环开始之前完成此操作,请记住,由于节点的事件性质,这可能在事件循环的一次迭代中处理任意数量的连接。这意味着,至少在理论上,进程中的每个函数都获得了CPU使用率所需要的东西,然后process.nextTick函数使用其余的函数。虽然这并非完全正确(例如,您的阻塞代码会弄乱这一点),但它是一个值得考虑的好模型。

好了,现在(最后)问您真正的问题,分别的流程又如何呢?

有趣的是,OS和CPU通常在本质上也经常是“事件”。每当进程想要做某事时(例如,在节点的情况下,启动事件循环的迭代),它都会向OS发出要处理的请求,然后OS将该作业插入就绪队列中(优先级高)它在CPU调度程序决定解决该问题时执行。这再次是一个过于简化的模型,但是要取消的核心概念是类似于节点的事件循环,每个进程都获得了它“需要”的东西,然后像您的节点应用程序这样的进程尝试通过填写以下内容来尝试执行差距。

因此,当您的节点进程说它占用了100%的cpu时,这是不准确的,否则,将一事无成,并且系统将崩溃。从本质上讲,它占用了所有可以使用的CPU,但OS仍然确定有其他东西要插入。

如果要添加执行相同过程的第二个节点进程。nextTick,则操作系统将尝试容纳两个进程,并且根据每个节点进程的事件循环上要完成的工作量,操作系统将把工作分解因此(至少从理论上讲,但实际上可能会导致一切变慢和系统不稳定)。

再一次,这是非常简单的,但是希望它能使您对正在发生的事情有所了解。话虽这么说,否则我不建议您使用process.nextTick,除非您知道需要使用它,如果每隔5毫秒执行一次操作是可以接受的,则使用setTimeout代替process.nextTick可以节省CPU使用率。

希望能回答您的问题:D

关于node.js - 使用递归process.nexttick是否可以使其他进程或线程正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com