首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用并发的错误值示例

使用并发的错误值示例
EN

Stack Overflow用户
提问于 2018-06-03 04:49:43
回答 1查看 40关注 0票数 -1

我正在写一本电子书,下面是我写的代码:

代码语言:javascript
代码运行次数:0
运行
复制
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使用每个运行命令检索不同的值。当我不执行睡眠命令时,它似乎工作得更好。

在任何情况下,我认为任何循序渐进的解释对我学习并发都是有益的

下面是我的返回值与时间睡眠的示例:

代码语言:javascript
代码运行次数:0
运行
复制
4 : 0
1 : 0
6 : 0
0 : 0
5 : 0
7 : 0
8 : 0
2 : 0
3 : 0
9 : 0
9 : 1
hi

然后我再运行一次,现在我得到了时间睡眠:

代码语言:javascript
代码运行次数:0
运行
复制
0 : 0
hi
1 : 0

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

代码语言:javascript
代码运行次数:0
运行
复制
0 : 0
hi

这一次没有睡眠的我得到:

代码语言:javascript
代码运行次数:0
运行
复制
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

更新

需要注意的是,此调用是从主包调用的,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
func main()
{
   lab.ConcurrMain()
}

UPDATE2

我补充道:var wg sync.WaitGroup outside the func scope. I also addedwg.Add(1)inside theConcurrMainmethod just prior togo f(i), then i also addedwg.Wait()just after theforloop,它执行go functionand then finallywg.Done()inside thef()`方法**,这似乎是有效的,但这个答案在电子书中没有,所以我想要理解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 06:12:38

在go中,一个程序只有在它的主goroutine运行时才会运行。也就是说,最初运行main函数的goroutine,如果这个函数退出,整个程序就会退出。

在您最初给出的示例(代码片段)中,当您在ConcurrMain中启动的goroutines将被调度并运行时,没有什么需要强制执行的。在添加sync.WaitGroup之前,主goroutine可以在其他goroutine被调度之前退出。

如果主goroutine退出,则整个程序退出,其他goroutine将不会执行。主goroutine不会等待其他goroutine,除非您通过一个等待组明确要求它这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50661042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档