gpt4 book ai didi

go - 并发示例的值不正确

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:33 27 4
gpt4 key购买 nike

我正在阅读一本电子书,在这里我正在执行以下代码:

func f(n int) {
for i := 0; i < 10; i++ {
fmt.Println(n, ":", i)
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
}
}

func ConcurrMain() {
for i := 0; i < 10; i++ {
go f(i)
}
fmt.Println("hi")
}

问题是我通过 goclipse 在每个运行命令中检索不同的值。当我不执行 sleep 命令时,它似乎工作得更好。

无论如何,我认为任何一步一步的解释都会对我学习并发有益

这是我的 sleep 时间返回值的示例:

4 : 0
1 : 0
6 : 0
0 : 0
5 : 0
7 : 0
8 : 0
2 : 0
3 : 0
9 : 0
9 : 1
hi

然后我再次运行它,现在我开始 sleep 了:

0 : 0
hi
1 : 0

现在是第三次,我终于睡着了:

0 : 0
hi

这次不 sleep 我得到:

1 : 0
1 : 1
1 : 2
1 : 3
1 : 4
1 : 5
1 : 6
1 : 7
1 : 8
3 : 0
3 : 1
4 : 0
4 : 1
4 : 2
9 : 0
6 : 0
6 : 1
6 : 2
2 : 0
2 : 1
2 : 2
2 : 3
2 : 4
2 : 5
2 : 6
2 : 7
2 : 8
2 : 9
7 : 0
7 : 1
7 : 2
7 : 3
7 : 4
7 : 5
7 : 6
5 : 0
5 : 1
5 : 2
5 : 3
5 : 4
5 : 5
5 : 6
5 : 7
5 : 8
5 : 9
9 : 1
1 : 9
8 : 0
3 : 2
hi

我在 windows 下使用 goclipse 以防信息相关

更新

需要注意的是,这个调用是从主包中调用的:

func main()
{
lab.ConcurrMain()
}

更新 2

我添加了:var wg sync.WaitGroup 在 func 范围之外。我还在go f(i)之前的ConcurrMain方法中添加了wg.Add(1),然后我还添加了wg.Wait()就在执行 go 函数的 forloop 之后最后wg.Done()f()`方法 ** 这似乎可行,但该答案不在电子书中,所以我想了解一下。

最佳答案

在 go 中,程序只会在其主 goroutine 运行时运行。即原本运行main函数的goroutine,如果这个退出,则整个程序退出。

在您最初给出的示例(代码片段)中,何时您在 ConcurrMain 中启动的 goroutine 将被安排和运行,没有任何强制措施。在添加 sync.WaitGroup 之前,主 goroutine 可以在其他 goroutine 被安排之前退出。

如果主goroutine退出,则整个程序退出,其他goroutine不会执行。主 goroutine 不会等待其他 goroutine,除非你特别要求它有一个 WaitGroup 。

关于go - 并发示例的值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com