为什么在函数内启动多个 Goroutine 不会产生任何输出?

问题描述 投票:0回答:1

我是 Golang 新手,所以正在关注(Go 之旅

我在代码编辑器中修改了代码如下:

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 3; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func run() {
    go say("A")
    say("B")
}

func main() {
    run()
}

它产生以下并发输出:

B
A
A
B
B

但是如果我将

say("B")
更改为
go say("B")
,程序将终止而不产生任何输出。

我预计会出现类似的并发输出,因为该函数正在将两个单独的 Goroutines 生成到不同的线程中。但我相信该函数正在返回并在 Goroutine 启动之前终止进程。

go concurrency goroutine
1个回答
0
投票

您的程序正在启动 goroutines,然后立即退出,因此 goroutines 没有时间产生输出。您需要等待 goroutines 完成 - 一种方法是使用

WaitGroup
:

package main

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

func say(s string) {
    for i := 0; i < 3; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func run() {
    var wg sync.WaitGroup

    wg.Add(1)
    go func() {
        defer wg.Done()
        say("A")
    }()

    wg.Add(1)
    go func() {
        defer wg.Done()
        say("B")
    }()

    wg.Wait()
}

func main() {
    run()
}

去游乐场

© www.soinside.com 2019 - 2024. All rights reserved.