Golang Go语言利用多核问题

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言利用多核问题

不知道怎么起标题,描述下问题

之前是做 Node.js ,因为 Node.js 是单线程,所有之前想在一台多核的机器上充分利用 CPU 就使用 PM2 的 cluster 模式部署(作用就是可以直接启动多个实例,虽然 Node.js 里有用 cluster 模式编程,但是那样增加了编程的复杂度)

假如我现在有一个 restful api 服务,这个服务有 A,B 两个 api,A 很耗 CPU,考虑极限情况请求 A 的时候会把 CPU 跑满

如果用 Node.js 实现的话,部署在服务器上只启动一个实例的情况下,当用户请求 A 了之后还没 response 的情况下,另一个用户请求了 B,这时候 A 把 CPU 跑满了,B 只能等待 A 处理完

但是如果我把这个服务部署在一个双核的服务上,然后用 PM2 启动 2 个实例后,理论上 A 还没 response 的时候 B 是不会等待的(只考虑有 2 个用户在同时发起请求)

现在切换到 go,在一个双核的服务器上如果我只启动一个实例的情况下,go 会自动利用多核么?还是我需要用 goroutine 去自己编写代码来利用多核

可以用一种简单粗暴的办法来启动 2 个实例:就是把这个程序复制 2 份,让他们分别监听不同的端口,然后在自己做负载均衡😂

描述的不一定准确,但差不多就是这个意思


更多关于Golang Go语言利用多核问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

19 回复

建议先理解 goroutine 调度概念,答案是会自动 不需要额外编写代码。

更多关于Golang Go语言利用多核问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go 标准库的 http 服务封装了 goroutine,每一个请求都在单独的 goroutine 中执行,可以利用多核,不需要自己处理。

简单说,node 是无栈协程,通过事件循环调度,go 是有调度层,是有栈的,也存在切换,完全两个概念

  1. Stackless + EventLoop 可以是多核的,典型的如 Kotlin Coroutines。
    2. Stackfull 的 Goroutines 也是支持多核的。

golang 最核心的就是 mutex m:n 的 runtime。

支持真实多线程的语言开发理论上都可以跑满 CPU

单线程,GIL 什么的那些的只能跑满单核

需要自己写代码支持

自动的…内部写好了

大佬。能讲的更仔细点吗。没明白

golang 的 Goroutines 是自动支持多核的

Node.js 的这个痛点在 golang 上不存在,放心用

nodejs 把计算任务切分,用 nextTick 穿起来也行啊

golang 里有个 SetMaxProcs 的函数(不记得是不是这样了,可以去 golang 官网查下) 现在默认都是开启满核了( go1.x 之前的版本还得手动调) 一般这个参数不用管就够了 但之前看过一篇文章 把这个参数设置为 CPU 核的倍数的 比如 16 核 可以设置最大 128 还是 256 来着 这个参数设置了 goroutine 就是跑在多核上了

具体优化没用到过 不过 lz 可以 google 搜一下那篇文章 很详细的

nexttick 也没法多核运行吧,好像一个 node 就是一个进程,只能一个 CPU 跑

没法多核,但是不会让其他请求等太久,另外 nodejs 也可以 fork 一个进程去做一些计算任务

nodejs 一个进程只能利用单核, 但是因为有事件循环, 所以当一个请求在处理 io 的时候也可以处理另外一个请求, 并不是只能等在那里

看错了 说的是把 CPU 跑满的任务, 那还是 go

针对Golang(Go语言)利用多核的问题,以下是一些专业建议:

  1. 使用Goroutine:Goroutine是Go语言中的轻量级线程,通过“go”关键字可以方便地启动新的Goroutine。它们适合处理大量并发任务,且创建和调度开销小,能有效利用多核CPU的并行能力。
  2. 设置GOMAXPROCS:此环境变量决定了Go程序可以使用的最大CPU核心数。默认情况下,Go程序只会使用一个CPU核心。通过合理设置GOMAXPROCS,可以确保程序充分利用多核CPU的性能,提高并行处理效率。
  3. 使用Channel进行通信:Channel是Go语言中的数据传输机制,用于在不同的Goroutine之间传递数据。它能确保数据传输的安全性和同步性,避免数据竞争和死锁问题。
  4. 使用sync包进行同步控制:Go语言的sync包提供了多种用于同步控制的原语,如Mutex和WaitGroup等。它们可以帮助开发者更精细地控制并发任务的执行顺序和同步,确保数据访问的安全性和正确性。

综上所述,通过结合使用Goroutine、合理设置GOMAXPROCS、利用Channel进行通信以及使用sync包进行同步控制,Go语言程序可以充分利用多核CPU的性能优势,实现高效的并行处理。

回到顶部