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

我该如何使用戈麦斯?下面的代码设置了 gomaxprocs,但随后会生成更多的工作线程。我预计有2个进程,但仍有5个仍在运行。


package main


import (

    "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()

}


交互式爱情
浏览 65回答 1
1回答

BIG阳

对于 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go