gpt4 book ai didi

node.js - Nodejs EventLoop(带集群模块)和Golang Scheduler的比较

转载 作者:数据小太阳 更新时间:2023-10-29 03:39:02 26 4
gpt4 key购买 nike

在 nodejs 中,主要批评者基于其单线程事件循环模型。

nodejs 最大的缺点是无法在应用程序中执行 CPU 密集型任务。为了演示目的,让我们以 while 循环为例(这可能类似于一个返回十万条记录的 db 函数,然后在 nodejs 中处理这些记录。)

while(1){
x++
}

此类代码将阻塞主堆栈,因此事件队列中等待的所有其他任务将永远没有机会执行。 (而在 web 应用程序中,新用户将无法连接到该应用程序)。

但是,可以使用像cluster 这样的模块来利用多核系统并部分解决上述问题。 Cluster 模块允许创建一个由独立进程组成的小型网络,这些进程可以共享服务器端口,这使 Node.js 应用程序可以访问服务器的全部功能。 (但是,使用 Cluster 的最大缺点之一是无法在应用程序代码中维护状态)。但是,如果服务器负载过大,我们很有可能再次陷入同样的​​情况(如上所述)。

当我开始学习 Go 语言并了解它的架构和 goroutine 时,我认为它可能会解决由于 nodejs 的单线程事件循环模型而出现的问题。并且它可能会避免上述 CPU 密集型任务的场景,直到我遇到这段有趣的代码,它阻塞了所有 GO 应用程序并且什么也没有发生,很像 nodejs 中的 while 循环。

func main() {
var x int
threads := runtime.GOMAXPROCS(0)
for i := 0; i < threads; i++ {
go func() {
for { x++ }
}()
}
time.Sleep(time.Second)
fmt.Println("x =", x)
}
//or perhaps even if we use some number that is just greater than the threads.

所以,问题是,如果我有一个负载密集型应用程序,并且还会有很多 CPU 密集型任务,我可能会陷入上述情况。 (其中 db 返回大量行,然后应用程序需要处理和修改这些行中的某些内容)。传入的用户不会被阻止,所有其他任务也会被阻止吗?

那么,如何解决上述问题呢?

附言
或许,我提到的用例没有多大意义? :)

最佳答案

目前(Go 1.11 及更早版本)你所谓的紧密循环确实会阻塞代码。发生这种情况仅仅是因为当前 Go 编译器插入执行“抢占检查”的代码(«我应该放弃吗?到调度程序,以便它运行另一个 goroutine?») 仅在它编译的函数的序言(几乎,但我们不要离题)。如果您的循环不调用任何函数,则不会进行抢占检查将被制作。

Go 开发者很清楚这一点和 are working on eventually alleviating this issue .

仍然请注意,您所谓的问题在最真实的场景:执行很长时间的代码在不调用任何函数的情况下运行 CPU 密集型工作很少见,而且介于两者之间。

在某些情况下,您确实拥有这样的代码并且您拥有检测到它真的让其他 goroutines 饿死(让我强调一下:你已经通过分析发现了这一点——作为反对只是想出“它一定很慢”),你可以应用几种技术来处理这个问题:

  • 插入对 runtime.Gosched() 的调用在某些关键点长时间运行的 CPU 密集型代码。这将强制放弃对另一个 goroutine 的控制而实际上并没有挂起调用者 goroutine(所以它会一旦再次安排就运行)。
  • 为运行的 goroutines 提供专用的 OS 线程那些 CPU pig :
    1. 将这样的 CPU 占用集合绑定(bind)到,比如说,N 个“worker goroutines”;
    2. 在他们前面放一个调度员(这叫做 "fan-out" );
    3. 确保 N 明显小于 runtime.GOMAXPROCS提高后者,这样您就有了 N 个额外的线程。
    4. 通过调度程序将工作单元分配给那些专用的 goroutine。

关于node.js - Nodejs EventLoop(带集群模块)和Golang Scheduler的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375902/

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