Go限制运行时操作系统线程数量

Go语言的运行时系统使用了自己的调度器,该调度器使用了M:N模型,即M个goroutine可以在N个操作系统上进行调度。我们可以通过设置环境变量GOMAXPROCS或者使用runtime包中的GOMAXPROCS函数来限制Go程序可以使用的操作系统数。默认情况下,GOMAXPROCESS的值为系统的CPU核数。

go 复制代码
package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	// 设置最大可用的 CPU 核心数为 2
	runtime.GOMAXPROCS(2)

	// 使用 WaitGroup 等待两个 goroutine 完成
	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		for i := 1; i <= 5; i++ {
			fmt.Println("A", i)
		}
	}()

	go func() {
		defer wg.Done()
		for i := 1; i <= 5; i++ {
			fmt.Println("B", i)
		}
	}()

	// 等待所有 goroutine 完成
	wg.Wait()
}

虽然GOMAXPROCS可以限制Go程序可以使用的操作系统线程数量,但最好不要轻易设置这个值,因为正常情况下,Go会自己觉得使用的线程数以保证运行时最高的效率和性能。

而在实际应用中,GOMAXPROCS往往使用于一个CPU核数非常多而且都处于高负载的机器上,防止CPU过度竞争。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

相关推荐
我不会起名字3227 小时前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
我不会起名字3227 小时前
Redis 从 0 到 1(二十三):一个热 key 打到 10 万 QPS——hotkey 与本地缓存的 Go 实现
redis·缓存·go·qps·hotkey
Patrick_Wilson20 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
Patrick_Wilson20 小时前
从文本输出理解 Go 方法与接口
后端·go·编程语言
Patrick_Wilson1 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
Patrick_Wilson1 天前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言
Patrick_Wilson1 天前
执行 go build . 后,Go 怎样找到代码并生成程序
后端·go·编程语言
Patrick_Wilson1 天前
Go 变量不赋值时,为什么也有值
后端·go·编程语言
Patrick_Wilson1 天前
读 Go 项目里的命令:run、build、test 分别做了什么
后端·go·编程语言
vipxieliang1 天前
Go GC 性能优化实践:从 GOGC、GOMEMLIMIT 到分配热点定位
go