是否使用recursionprocess.nexttick让其他进程或线程工作?

技术上,当我们执行下面的代码(recursionprocess.nexttick),CPU使用率将达到100%或接近。 问题是想象我正在一台CPU上运行,另一个节点HTTP服务器正在工作,它是如何影响它的?

线程做recursionprocess.nexttick让HTTP服务器工作吗?

如果我们有两个线程的recursionprocess.nexttick,他们都得到50%的份额?

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

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

谢谢

       

网上收集的解决方案 "是否使用recursionprocess.nexttick让其他进程或线程工作?"

为了理解这里发生的事情,你必须理解关于节点的事件循环以及操作系统和CPU的一些事情。

首先,让我们更好地理解这个代码。 你叫这个recursion,但是呢?

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

虽然这是一种自己调用的方法(间接通过callback),事件循环会扭曲实际发生的事情。

process.nextTick将一个函数作为callback函数,并将其放在事件循环的下一个checkbox中的事件列表中。 然后执行此callback,完成后再次注册相同的callback。 从本质上讲,这个和真正的recursion关键区别在于,我们的调用堆栈永远不会获得更多的调用。 我们从来没有“放松”堆栈,我们只是有很多小的短堆栈。

好吧,为什么这个问题呢?

当我们更好地理解事件循环和实际发生的事情时,我们可以更好地理解系统资源是如何使用的。 通过以这种方式使用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使用率如何在程序的两个不同部分之间分离? 那么很难说,但如果我们了解事件循环,我们至less可以猜测。

因为我们使用了process.nextTick,所以doIntervalStuff函数每次都会在事件循环的“开始”处运行,但是如果HTTP服务器需要做某些事情(比如处理一个连接),那么我们知道会得到在下一次事件循环开始之前完成,并记住,由于节点的性质本来就是这样,所以可以在事件循环的一次迭代中处理任意数量的连接。 这意味着,至less在理论上,进程中的每个函数都可以获得它所需要的CPU使用情况,然后使用process.nextTick函数。 虽然这不完全正确(例如,你的一些阻塞代码会搞砸这个),但这是一个足够好的模型来思考。

好吧,现在(最后)你真正的问题,单独的过程呢?

有趣的是,操作系统和CPU通常也是非常“平坦”的。 每当一个进程想要做一些事情(比如在节点的情况下,开始一个事件循环的迭代),它向操作系统发出一个请求来处理,然后操作系统把这个作业推到一个准备好的队列中(这是优先的)并在CPU调度程序决定解决时执行。 这再次是一个过于简化的模型,但是拿掉的核心概念就像在node的事件循环中一样,每个进程都得到了它“需要”的东西,然后像节点应用这样的进程尽可能地通过填充差距。

所以当你的节点进程说它占用了100%的cpu时,这是不准确的,否则没有别的事情会做完,系统会崩溃。 本质上,它占用所有的CPU,但操作系统仍然决定其他的东西滑入。

如果要添加一个执行相同process.nextTick的第二个节点进程,操作系统将尝试同时适应这两个进程,并根据每个节点进程的事件循环所要完成的工作量,操作系统将分割工作(至less在理论上,但实际上可能会导致一切放缓和系统不稳定)。

再一次,这是非常简单的,但希望它给你一个想法是怎么回事。 这就是说,我不会build议使用process.nextTick,除非你知道你需要它,如果每5毫秒做一些事情是可以接受的,使用setTimeout而不是process.nextTick将保存在CPU使用情况的oodles。

希望能回答你的问题:D

不可以。您不必为了让别人做他们的工作而人为地暂停stream程,您的操作系统就有这个机制。 实际上,以这种方式使用process.nextTick会使您的计算机变慢,因为它有很多开销。