gpt4 book ai didi

go - 为什么 golang sched 在变量为奇数或偶数时运行不同?是巧合还是命中注定?

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

我有一个golang代码示例如下(xx.go):

package main

import "runtime"

func main() {
c2 := make(chan int)

go func() {
for v := range c2 {
println("c2 =", v, "numof routines:", runtime.NumGoroutine())
}
}()

for i:=1;i<=10001;i++{
c2 <- i
//runtime.Gosched()
}
}
  • 当循环计数为奇数时,比如 10001,代码将输出所有数字。
  • 当循环计数为偶数时,比如 10000,代码将输出所有数字但最后一个!

这是为什么?

我测试过从小到2到大到10000的数字,都遵守上面的规则!

环境如下:

uname -a : Linux hadoopnode25232 2.6.18-308.16.1.el5 #1 SMP Tue Oct 2 22:01:43 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

go版本:go版本go1.1 linux/amd64

我觉得跟go sched有点关系。

我组装代码:

go tool 6g -S xx.go > xx.s

10000 和 10001 之间的唯一区别是:

33c33
< 0030 (xx.go:20) CMPQ AX,$10001
---
> 0030 (xx.go:20) CMPQ AX,$10000

最后但同样重要的是,当我添加 runtime.Gosched() 时,一切运行良好。

最佳答案

当 main 返回时,程序终止。它不会等待任何 goroutines 完成。因此,是否所有 goroutine 都按时完成取决于调度程序,并且还取决于相当多的随机性、巧合性和外部因素。 1e4 和 1e4+1 迭代之间的差异可能是那些影响调度的因素之一,仅在使 goroutine 及时完成的​​那一位上。

如果您确实需要 goroutine 在退出前完成,请等待它完成,例如使用 sync.WaitGroup。

与实际问题无关,您的代码过于复杂且不合常理。您可以按如下方式重写 goroutine 函数:

for v := range c2 {
println("c2 =", v,"numof routines:",runtime.NumGoroutine())
}

关于go - 为什么 golang sched 在变量为奇数或偶数时运行不同?是巧合还是命中注定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227225/

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