Golang Go语言中关于 goroutine 的一个小问题

代码如下:

https://gist.github.com/leo1971/20a4eb3260a1e4a1c68a916c01257c89 <button onclick="lazyGist(this)"> 显示 Gist 代码 </button>


sum 函数对传入的数组做累加,main 开了两个 goroutine 分别将两个数组传入 sum 函数,按理说输出应该是
17 -5 12

但是我在第一个 goroutine 后面再加一个延时之后,结果就变成了
-5 17 12

所以,我的问题是,为什么会这样啊…
Golang Go语言中关于 goroutine 的一个小问题


更多关于Golang Go语言中关于 goroutine 的一个小问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

18 回复

goroutine 执行顺序与代码顺序并不关联,如果你要看到效果,建议将 sleep 时间加大

更多关于Golang Go语言中关于 goroutine 的一个小问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


放再大都是-5 17…而且我觉得对于这种小小的代码,执行顺序还是有关系的啊,谁先执行谁就先进 channel,也就是先被 print,不是这样吗

代码问题吧 sum(s[len(s)/2:], c) 明明先传的后半部分。

是的,这是我的错误。但是如果把延时去掉,结果会反过来,这又如何解释呢

应该是切片时间导致的 s[len(s)/2:] 的 时间 大于 s[:len(s)/2] 的时间

#5 没有吧,我刚都试了试,怎么样,结果都是-5 17 12。



sum 时间复杂度都是一样的,正常就是应该最早创建的 goroutine 先返回啊,就是-5 17 12




感谢回答,我怀疑是我测试用的官方 playground 的原因,明天换到本地编译试试

我在本地测试结果与你的一样,猜测同时开启 2 个 goroutine 返回结果的顺序是不确定的,不同的机器会有不同结果表现

make sense.但是为什么时间会不一样呢

hhh 瞎说的 不对不对

跟 Goroutine 调度器有关 其实是 随机的

不是啊,不改代码的话,重复 n 次都是一样的结果

我写了个循环 还是有小概率出现另一种情况的 你试试


正确的理解是,“不要对多个 goroutine 的执行顺序做任何的假设、不要试图去解释多个并发 goroutine 实际的顺序问题。”。
按目前的实现上,你高概率会测出一样的结果,但是在其他的机器、其他的代码、其他的环境、其他版本的 golang 上,这些顺序是不保证的。

当然,我很乐意帮你解答关于 Go 语言中 goroutine 的小问题。

goroutine 是 Go 语言中的一种轻量级线程,它允许你在同一地址空间中并发地执行函数。相比传统的线程,goroutine 的创建和销毁开销非常小,这使得在 Go 中实现高并发变得非常高效和简单。

关于 goroutine,有几点需要特别注意:

  1. 创建 goroutine:你可以通过 go 关键字来创建一个新的 goroutine。例如,go myFunction() 会启动一个新的 goroutine 来执行 myFunction 函数。

  2. 同步:由于 goroutine 是并发执行的,因此你需要使用通道(channel)或其他同步机制来确保数据的一致性和避免竞态条件。通道是 Go 中推荐的并发通信方式,它允许你在不同的 goroutine 之间安全地传递数据。

  3. 生命周期:goroutine 会一直运行,直到其内部的函数执行完毕。如果主 goroutine(即启动程序时创建的 goroutine)结束了,而其他 goroutine 还在运行,那么程序会继续运行,直到所有的 goroutine 都完成。

  4. 资源消耗:虽然 goroutine 的创建和销毁开销很小,但大量并发运行的 goroutine 仍然会消耗系统资源。因此,在设计并发程序时,你需要合理控制 goroutine 的数量和生命周期。

希望这些信息能帮助你更好地理解 Go 语言中的 goroutine。如果你有更具体的问题或需要进一步的帮助,请随时提问!

回到顶部