V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
AlpacaCode
V2EX  ›  Go 编程语言

当 P 的数量为 1 时 GMP 调度的问题

  •  
  •   AlpacaCode · 2022-05-10 14:13:02 +08:00 · 1419 次点击
    这是一个创建于 957 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```go
    package main

    import (
    "fmt"
    "runtime"
    "sync"
    )

    func main() {
    //
    wait := sync.WaitGroup{}
    runtime.GOMAXPROCS(1)
    wait.Add(20)
    str := "ABCDEFGHIJKLM"

    for i := 0; i < 10; i++ {
    go func(i int) {
    fmt.Println(i, "---")
    wait.Done()
    }(i)
    }

    for i, l := 0, len(str); i < l; i++ {
    go func(i int) {
    fmt.Println(string(str[i]))
    wait.Done()
    }(i)
    }
    fmt.Println("---------------")
    wait.Wait()
    }

    ```
    为什么这个程序会优先执行下面这个 goroutine 中的最后一个,然后再回到上面去执行
    输出结果如下
    ```
    ---------------
    M
    0 ---
    1 ---
    2 ---
    3 ---
    4 ---
    5 ---
    6 ---
    7 ---
    8 ---
    9 ---
    A
    B
    C
    D
    E
    F
    G
    H
    I
    ```
    如果从 GMP 的角度去看的话,一开始设置了 P 的数量为 1 那后续 G0 调用玩 goroutine 之后,把后续的 G 都塞到了本地 p 的队列里面 m 从里面取 输出的结果不应该是顺序的嘛, 为什么会产生单独输出一次 M 的现象

    我所认为的理想状态下输出的内容
    ```
    0123456789ABCDEFGHIM
    ```
    6 条回复    2022-05-11 14:12:21 +08:00
    hosora
        1
    hosora  
       2022-05-10 15:41:53 +08:00   ❤️ 1
    因为 p 还有个 run_next
    sardina
        2
    sardina  
       2022-05-10 15:57:44 +08:00
    tobeagoodfather
        3
    tobeagoodfather  
       2022-05-10 21:00:32 +08:00   ❤️ 1
    @hosora
    正解
    vxyun
        4
    vxyun  
       2022-05-11 00:09:21 +08:00   ❤️ 2

    每次创建 goruntine 时,都会把当前 p 的 runnext 设置为 newg
    AlpacaCode
        5
    AlpacaCode  
    OP
       2022-05-11 13:46:13 +08:00
    @sardina 这是啥意思,进去只有一个 helloworld
    AlpacaCode
        6
    AlpacaCode  
    OP
       2022-05-11 14:12:21 +08:00
    @vxyun 我去,没想到队列 p 上面还有个 run_next, 看懂了谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:11 · PVG 07:11 · LAX 15:11 · JFK 18:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.