美文网首页
go 中的 pmg

go 中的 pmg

作者: 蛐蛐儿阳 | 来源:发表于2020-05-06 12:21 被阅读0次

    看下面代码

    package main
    
    import (
        "fmt"
        "runtime"
        "sync"
    )
    
    func main() {
        runtime.GOMAXPROCS(1)
        wg := sync.WaitGroup{}
        wg.Add(20)
        for i := 0; i < 10; i++ {
            go func() {
                fmt.Println("A: ", i)
                wg.Done()
            }()
        }
        for i:= 0; i < 10; i++ {
            go func(i int) {
                fmt.Println("B: ", i)
                wg.Done()
            }(i)
        }
        wg.Wait()
    }
    

    问代码输出什么, 根本看不懂。

    runtime.GOMAXPROCS(1)
    

    设置最大可用cpu数量,这里故意设置成1, 只考虑一个cup的情况。
    然后引出pmg概念。
    p : cup
    m:M(work thread)代表工作线程
    g: G对象(goroutine)
    摘抄:

    在单核情况下,所有goroutine运行在同一个线程(M0)中,
    每一个线程维护一个上下文(P),任何时刻,
    一个上下文中只有一个goroutine,其他goroutine在runqueue中等待。
    一个goroutine运行完自己的时间片后,
    让出上下文,自己回到runqueue中(如下图左边所示)。
    
    当正在运行的G0阻塞的时候(可以需要IO),
    会再创建一个线程(M1),P转到新的线程中去运行。
    
    image.png

    WaiteGroup啥意思,哈哈,挖到宝了。
    https://studygolang.com/articles/12972?fr=sidebar

    利用管道可以实现goroutine按顺序执行,但有些大材小用,数量多内存开销大,可以用WaiteGroup代替。
    也很简单,就这三个方法 Add(), Done(), Wait()。
    wait挂起, add计数,如果计数成功, done关闭, 挂起下面的代码继续执行。

    相关文章

      网友评论

          本文标题:go 中的 pmg

          本文链接:https://www.haomeiwen.com/subject/pkgightx.html