gpt4 book ai didi

go - 关闭 channel 会退出多个go例程?

转载 作者:行者123 更新时间:2023-12-03 10:10:11 25 4
gpt4 key购买 nike

给出以下代码:

package main

import (
"fmt"
"time"
)

func first(quit chan error) {
fmt.Println("1")
for {
select {
case <-quit:
fmt.Println("first quits")
return
default:
time.Sleep(20 * time.Millisecond)
}
}
}

func second(quit chan error) {
fmt.Println("2")
for {
select {
case <-quit:
fmt.Println("second quits")
return
default:
time.Sleep(20 * time.Millisecond)
}
}
}

func main() {
quit := make(chan error)
go first(quit)
go second(quit)
//something happens here, let's just simulate with a sleep
time.Sleep(500 * time.Millisecond)
close(quit)
time.Sleep(500 * time.Millisecond)
}
似乎正确关闭一个 channel 会终止两个独立的go例程。我以为 channel 是1:1的通信路径,我首先尝试将 error写入 quit channel ,但是随后只有一个go例程会读取它。所以我一直在阅读各种扇出策略,直到我发现关闭 channel 可能才行。
以这种方式关闭 channel 是否是终止独立go例程的正确方法?

最佳答案

从封闭的 channel 读取总是成功的。因此,关闭 channel 通常用于广播从该 channel 读取的已发生某事(超时,取消请求等)的所有goroutine。
要回答您的问题:测试,关闭 channel 是一种让所有goroutine知道该终止的正确方法。这就是context.Context取消后的作用。

关于go - 关闭 channel 会退出多个go例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65111808/

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