并发串行打印

go concurrency prints serially

我正在尝试并发打印但无法弄清楚为什么它是连续的,已将代码放在下面

package main

import (
        "fmt"
        "sync"
)

func main() {
        fmt.Println("Hello, playground")
        var wg sync.WaitGroup
        wg.Add(2)
    go func(){
        for i := 0; i < 4; i++ {
                if i%2 == 0 {
                        fmt.Println("hi", i)
                }
        }
         wg.Done()
       }()
        go func() {

                for i := 0; i < 4; i++ {
                        if i%2 != 0 {
                                fmt.Println("g", i)
                        }

                }
                wg.Done()
        }()
        wg.Wait()
}

期望是 嗨0 g1 高2 g3

但我明白了

来自 g 1 从 g 3 嗨 0 嗨 2

这么小的函数不太可能证明并发性,因为第一个 goroutine 可能甚至在第二个 goroutine 开始之前完成,或者在上下文切换发生之前完成。如果在循环中添加一个小暂停,您将观察到交错:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        for i := 0; i < 4; i++ {
            if i%2 == 0 {
                fmt.Println("hi", i)
            }
            time.Sleep(10 * time.Millisecond)
        }
        wg.Done()
    }()
    go func() {
        for i := 0; i < 4; i++ {
            if i%2 != 0 {
                fmt.Println("from g", i)
            }
            time.Sleep(10 * time.Millisecond)

        }
        wg.Done()
    }()
    wg.Wait()
}