gpt4 book ai didi

go - 在生成 goroutine 的函数返回之后,发送到没有接收器的无缓冲 channel 的 goroutine 是否会永远阻塞?

转载 作者:行者123 更新时间:2023-12-01 22:16:55 24 4
gpt4 key购买 nike

请考虑以下处理程序,

http.HandleFunc("/task", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", *cors)
if r.Method != http.MethodPost {
http.Error(w, "only POST method is allowed", http.StatusMethodNotAllowed)
return
}
ack := make(chan bool)
go func() {
time.Sleep(time.Second)
ack <- false
}()
server.BroadcastToRoom(r.FormValue("alias"), "task", task{TaskID: "1"}, func() {
ack <- true
})
if a := <-ack; !a {
w.WriteHeader(http.StatusNoContent)
} else {
w.WriteHeader(http.StatusCreated)
}
})
BroadcastToRoom将回调作为参数。在这个回调中(这可能永远不会发生)
我向确认 channel 发送一个 bool 值。如果 1 秒后未确认,则超时。

我正在尝试实现超时的方法。我写了这个 goroutine 并且它有效。
然而,根据 this playground goroutine 在生成它的函数返回后继续运行。

所以我认为因为 goroutine 一直在运行并试图将值发送到没有接收器的无缓冲 channel ,所以 goroutine 将永远阻塞。我想我可以通过使用 1 的缓冲区大小来解决这个问题。

我想知道我的假设是否正确。如果是这样,有没有比使用缓冲区大小为 1 并让它静默完成更好的方法来阻止它?

最佳答案

在您的场景中,goroutine 将泄漏(它将继续存在)。如果没有人在收听该 channel ,则终止 goroutine 的正确方法是使用非阻塞写入:

 go func() {
time.Sleep(time.Second)
select {
case ack <- false:
default:
}
}()

这样,如果超时后没有人在听,它将选择 default , 并终止 goroutine。

关于go - 在生成 goroutine 的函数返回之后,发送到没有接收器的无缓冲 channel 的 goroutine 是否会永远阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59275255/

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