为了账号安全,请及时绑定邮箱和手机立即绑定

当更多的工人被显式调用时,gomaxprocs 被忽略

当更多的工人被显式调用时,gomaxprocs 被忽略

Go
交互式爱情 2022-10-04 19:35:30
我该如何使用戈麦斯?下面的代码设置了 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


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信