dpir3950 2015-06-17 00:28
浏览 32
已采纳

为什么我的并发函数在Go中过早退出? [重复]

This question already has an answer here:

I am looking through Go Bootcamp and am reading the Go Concurrency chapter right now. I have never used concurrency before in programming and don't understand the output of this program:

package main

import (
    "fmt"
    "time"
)

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

func main() {
    go say("world")
    say("hello")
}

Output:

hello
world
hello

Program exited.

Can someone explain why "world" is not printed twice like "hello"? And maybe elucidate the idea of using concurrency?

Note, Go Playground link here.

</div>
  • 写回答

1条回答 默认 最新

  • douyan1927 2015-06-17 00:53
    关注

    A Go program exits when main returns. In this case, your program is not waiting for the final "world" to be printed in another goroutine before exiting.

    The following code (playground) will ensure main never exits allowing the other goroutine to finish.

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func say(s string) {
        for i := 0; i < 2; i++ {
            time.Sleep(100 * time.Millisecond)
            fmt.Println(s)
        }
    }
    
    func main() {
        go say("world")
        say("hello")
        select{}
    }
    

    As you may have noticed, this results in a deadlock because the program has no way to go forward. You may wish to add a channel or a sync.Waitgroup to ensure the program exits cleanly immediately after the other goroutine completes.

    For example (playground):

    func say(s string, ch chan<- bool) {
        for i := 0; i < 2; i++ {
            time.Sleep(100 * time.Millisecond)
            fmt.Println(s)
        }
    
        if ch != nil {
            close(ch)
        }
    }
    
    func main() {
        ch := make(chan bool)
        go say("world", ch)
        say("hello", nil)
        // wait for a signal that the other goroutine is done
        <-ch
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器