第一个goroutine例子,奇怪的结果

时间:2013-09-03 19:20:46

标签: go goroutine

此示例取自tour.golang.org/#63

package main

import (
    "fmt"
    "time"
)

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

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

输出

hello
world
hello
world
hello
world
hello
world
hello

为什么world仅打印4次而不是5


修改:答案可以引自golang specification

  

程序执行从初始化主程序包开始,然后   调用函数main。当函数main返回时,   程序退出。它不等待其他(非主要)goroutines   完整。

3 个答案:

答案 0 :(得分:5)

当您的主要功能结束时,您的程序结束,即所有goroutine终止。 您的主要终止在go say("world")完成之前。如果你在主要结束时睡一段时间,你应该看到最后的世界。

答案 1 :(得分:4)

以下是使用sync.WaitGroup

正确解决同步问题的方法

Playground link

package main

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

func say(s string, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(2)
    go say("world", wg)
    go say("hello", wg)
    wg.Wait()
    fmt.Println("All done")
}

答案 2 :(得分:2)

因为调用gorouting在你生成的第二个之前终止了。这导致第二个关闭。为了说明,请稍微修改您的代码:

package main

import (
    "fmt"
    "time"
)

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

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

尝试在主要功能结束时进行“等待”或睡眠。

相关问题