gpt4 book ai didi

gooroutine 有没有优先级?

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

高浪鱼,求解释

goroutine有没有优先级?

package main

import (
"fmt"
)

func sum(a []int, c chan int) {
var total int
for _, v := range a {
total += v
}
c <- total
}

func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)

// x, y := <-c, <-c
x := <-c
y := <-c
fmt.Println(x, y, x+y)
}

为什么x是-5 y是17,不是第一个goroutine阻塞了吗?如果

go sum(a[:len(a)/2], c)
x := <-c
go sum(a[len(a)/2:], c)
y := <-c

这个顺序是对的。为什么。。。

最佳答案

在您的第一个示例中,输出应该是 -5 17 1217 -5 12。两个 goroutines 同时运行(同时)。无论哪个 goroutine 先完成,结果都将存储在变量 x 中。另一个 goroutine 的结果存储在 y 中。为了更好地查看 goroutines 是否并发运行,您可以在函数 sum() 中放置一个随机计时器。这样,您应该会看到不同运行之间的输出变化,因为一个 goroutine 随机地比另一个 goroutine 花费更长的时间:

package main

import (
"fmt"
"time"
"math/rand"
)

func sum(a []int, c chan int) {
time.Sleep(time.Duration(rand.Intn(1000000))) // wait for up to 1ms
total := 0
for _, v := range a {
total += v
}
c <- total
}

func main() {
rand.Seed(time.Now().Unix())
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)

x := <-c
y := <-c
fmt.Println(x, y, x+y)
}

在您的第二个示例中,您正在启动第一个 goroutine。然后你从 channel c 读取,这是一个阻塞操作(意味着它会等到有结果 => 第一个 goroutine 完成)。此处的输出是确定性的,始终为 17 -5 12

关于gooroutine 有没有优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36514462/

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