gpt4 book ai didi

goroutines 总是执行 "last in first out"

转载 作者:IT王子 更新时间:2023-10-29 01:19:27 26 4
gpt4 key购买 nike

为了学习更多关于 Go 的知识,我一直在玩 goroutines,并且注意到了一些东西 - 但我不确定我到底看到了什么,希望有人能够解释以下行为。

以下代码完全符合您的预期:

package main

import (
"fmt"
)

type Test struct {
me int
}

type Tests []Test

func (test *Test) show() {
fmt.Println(test.me)

}

func main() {
var tests Tests
for i := 0; i < 10; i++ {
test := Test{
me: i,
}
tests = append(tests, test)
}

for _, test := range tests {
test.show()
}

}

并按顺序打印 0 - 9。

现在,当代码如下所示更改时,它总是首先返回最后一个 - 不管我使用哪个数字:

package main

import (
"fmt"
"sync"
)

type Test struct {
me int
}

type Tests []Test

func (test *Test) show(wg *sync.WaitGroup) {
fmt.Println(test.me)
wg.Done()

}

func main() {
var tests Tests
for i := 0; i < 10; i++ {
test := Test{
me: i,
}
tests = append(tests, test)
}

var wg sync.WaitGroup
wg.Add(10)
for _, test := range tests {
go func(t Test) {
t.show(&wg)
}(test)
}
wg.Wait()

}

这将返回:901个2个3个4个5个6个78

循环的迭代顺序没有改变,所以我猜这与 goroutines 有关...基本上,我试图理解为什么它的行为是这样的......我知道 goroutines 可以以不同于它们产生的顺序运行,但是,我的问题是为什么它总是这样运行。好像有什么很明显我错过了......

最佳答案

正如预期的那样,输出是伪随机的,

package main

import (
"fmt"
"runtime"
"sync"
)

type Test struct {
me int
}

type Tests []Test

func (test *Test) show(wg *sync.WaitGroup) {
fmt.Println(test.me)
wg.Done()

}

func main() {
fmt.Println("GOMAXPROCS", runtime.GOMAXPROCS(0))
var tests Tests
for i := 0; i < 10; i++ {
test := Test{
me: i,
}
tests = append(tests, test)
}

var wg sync.WaitGroup
wg.Add(10)
for _, test := range tests {
go func(t Test) {
t.show(&wg)
}(test)
}
wg.Wait()

}

输出:

$ go version
go version devel +af15bee Fri Jan 29 18:29:10 2016 +0000 linux/amd64
$ go run goroutine.go
GOMAXPROCS 4
9
4
5
6
7
8
1
2
3
0
$ go run goroutine.go
GOMAXPROCS 4
9
3
0
1
2
7
4
8
5
6
$ go run goroutine.go
GOMAXPROCS 4
1
9
6
8
4
3
0
5
7
2
$

你在围棋 Playground 运行吗? Go Playground 在设计上是确定性的,这使得缓存程序变得更加容易。

或者,您是否使用 runtime.GOMAXPROCS = 1 运行?这一次按顺序运行一件事。这就是 Go Playground 的作用。

关于goroutines 总是执行 "last in first out",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35153010/

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