关于Goroutines并发性的Go of Go示例

时间:2016-09-08 05:24:48

标签: go

我是Go语言的新手,并在这里学习: https://tour.golang.org/concurrency/1

当我运行https://play.golang.org/p/9JvbtSuv5o时,结果为:

world
hello
hello

因此添加了sync.WaitGrouphttps://play.golang.org/p/vjdhnDssGk

package main

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

var w sync.WaitGroup

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

func main() {
    w.Add(1)
    go say("world")
    say("hello")
    w.Wait()
}

但结果是一样的:

world
hello
hello

我的代码出了什么问题?

请帮忙,
谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

w.Done()递减WaitGroup计数器 因此,您的代码有时会出现恐慌:同步:负WaitGroup计数器。

你有两个Goroutines:
1 - go say("world")
2 - say("hello")main Goroutine内 所以使用w.Add(2),请参阅此工作示例(The Go Playground):

package main

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

var w sync.WaitGroup

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

func main() {
    w.Add(2)
    go say("world")
    say("hello")
    w.Wait()
}

输出:

world
hello
hello
world

我希望这会有所帮助。

答案 1 :(得分:0)

您只是向WaitGroup添加1,但是从say的2次调用中调用Done。

在您的示例中,使用2启动WaitGroup将起作用

w.Add(2)

答案 2 :(得分:0)

由于无条件调用w.Done()而出现问题。所以,当你打电话说(“你好”)时,这也减少了对waitGroup的反击。

参考https://play.golang.org/p/wJeAyYyjA2

~/myprogram/