我该如何使用戈麦斯?下面的代码设置了 gomaxprocs,但随后会生成更多的工作线程。我预计有2个进程,但仍有5个仍在运行。package mainimport ( "fmt" "runtime" "sync" "time")func worker(i int, waiter chan struct{}, wg *sync.WaitGroup) { defer func(waiter chan struct{}, wg *sync.WaitGroup) { fmt.Printf("worker %d done\n", i) wg.Done() <-waiter }(waiter, wg) fmt.Printf("worker %d starting\n", i) time.Sleep(time.Second)}func main() { runtime.GOMAXPROCS(2) var concurrency = 5 var items = 10 waiter := make(chan struct{}, concurrency) var wg sync.WaitGroup for i := 0; i < items; i++ { wg.Add(1) waiter <- struct{}{} go worker(i, waiter, &wg) } wg.Wait()}
1 回答
BIG阳
TA贡献1859条经验 获得超6个赞
对于 C/C++程序员认为的线程,Go 有三个概念:G、P、M。
M = 实际螺纹
G = 戈鲁廷斯(即程序中的代码)
P = 处理器
没有用于限制 Ms 数量的 Go API,也没有用于限制 Gs 数量的 API - 每次调用都会创建一个新的 API。事情是用来限制Ps的。go func(...)
GOMAXPROCS
每个 P 用于跟踪某些正在运行的戈鲁廷的运行时状态。
你应该把它想象成致力于运行戈鲁廷的女士的峰值数量。(还有其他一些 Ms 不运行 Goroutines,但处理垃圾回收任务,并用作模板线程,用于根据需要创建新 Ms 等。一些 Ms 致力于保持运行时状态,而某些 Go 代码在系统调用中被阻止。GOMAXPROCS
因此,就程序中的代码而言,是其Go代码执行的并行度的约束。当一个正在运行的戈鲁廷到达它被阻塞的点时,它被停放,其P用于恢复执行其他一些未被阻塞的戈鲁廷。GOMAXPROCS
- 1 回答
- 0 关注
- 64 浏览
添加回答
举报
0/150
提交
取消