Golang Go语言中关于 goroutine 的一个小问题
代码如下:
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
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
mark
感谢回答,我怀疑是我测试用的官方 playground 的原因,明天换到本地编译试试
我在本地测试结果与你的一样,猜测同时开启 2 个 goroutine 返回结果的顺序是不确定的,不同的机器会有不同结果表现
make sense.但是为什么时间会不一样呢
hhh 瞎说的 不对不对
跟 Goroutine 调度器有关 其实是 随机的
不是啊,不改代码的话,重复 n 次都是一样的结果
我写了个循环 还是有小概率出现另一种情况的 你试试
正确的理解是,“不要对多个 goroutine 的执行顺序做任何的假设、不要试图去解释多个并发 goroutine 实际的顺序问题。”。
按目前的实现上,你高概率会测出一样的结果,但是在其他的机器、其他的代码、其他的环境、其他版本的 golang 上,这些顺序是不保证的。
当然,我很乐意帮你解答关于 Go 语言中 goroutine 的小问题。
goroutine 是 Go 语言中的一种轻量级线程,它允许你在同一地址空间中并发地执行函数。相比传统的线程,goroutine 的创建和销毁开销非常小,这使得在 Go 中实现高并发变得非常高效和简单。
关于 goroutine,有几点需要特别注意:
-
创建 goroutine:你可以通过
go
关键字来创建一个新的 goroutine。例如,go myFunction()
会启动一个新的 goroutine 来执行myFunction
函数。 -
同步:由于 goroutine 是并发执行的,因此你需要使用通道(channel)或其他同步机制来确保数据的一致性和避免竞态条件。通道是 Go 中推荐的并发通信方式,它允许你在不同的 goroutine 之间安全地传递数据。
-
生命周期:goroutine 会一直运行,直到其内部的函数执行完毕。如果主 goroutine(即启动程序时创建的 goroutine)结束了,而其他 goroutine 还在运行,那么程序会继续运行,直到所有的 goroutine 都完成。
-
资源消耗:虽然 goroutine 的创建和销毁开销很小,但大量并发运行的 goroutine 仍然会消耗系统资源。因此,在设计并发程序时,你需要合理控制 goroutine 的数量和生命周期。
希望这些信息能帮助你更好地理解 Go 语言中的 goroutine。如果你有更具体的问题或需要进一步的帮助,请随时提问!