Golang 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
建议先理解 goroutine 调度概念,答案是会自动 不需要额外编写代码。
更多关于Golang Go语言利用多核问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go 标准库的 http 服务封装了 goroutine,每一个请求都在单独的 goroutine 中执行,可以利用多核,不需要自己处理。
简单说,node 是无栈协程,通过事件循环调度,go 是有调度层,是有栈的,也存在切换,完全两个概念
- 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 的时候也可以处理另外一个请求, 并不是只能等在那里
针对Golang(Go语言)利用多核的问题,以下是一些专业建议:
- 使用Goroutine:Goroutine是Go语言中的轻量级线程,通过“go”关键字可以方便地启动新的Goroutine。它们适合处理大量并发任务,且创建和调度开销小,能有效利用多核CPU的并行能力。
- 设置GOMAXPROCS:此环境变量决定了Go程序可以使用的最大CPU核心数。默认情况下,Go程序只会使用一个CPU核心。通过合理设置GOMAXPROCS,可以确保程序充分利用多核CPU的性能,提高并行处理效率。
- 使用Channel进行通信:Channel是Go语言中的数据传输机制,用于在不同的Goroutine之间传递数据。它能确保数据传输的安全性和同步性,避免数据竞争和死锁问题。
- 使用sync包进行同步控制:Go语言的sync包提供了多种用于同步控制的原语,如Mutex和WaitGroup等。它们可以帮助开发者更精细地控制并发任务的执行顺序和同步,确保数据访问的安全性和正确性。
综上所述,通过结合使用Goroutine、合理设置GOMAXPROCS、利用Channel进行通信以及使用sync包进行同步控制,Go语言程序可以充分利用多核CPU的性能优势,实现高效的并行处理。