美文网首页
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