首页 > 解决方案 > go concurrency 串行打印

问题描述

我正在尝试同时打印但无法弄清楚为什么它的序列号,已将代码放在下面

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

期望是 hi0 g1 hi2 g3

但我明白了

从 g 1 从 g 3 hi 0 hi 2

标签: goconcurrency

解决方案


这么小的函数不太可能展示并发性,因为第一个 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()
}

推荐阅读