Goroutines 阻塞其他
在 Go 中,goroutine 是一个轻量级的执行线程。通常情况下,goroutine 可以并发运行,不会互相阻塞。然而,在某些情况下,一个 Goroutine 可以阻止其他 Goroutine 的执行。
考虑以下代码:
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
在此示例中,一个 Goroutine 以无限循环启动。通常,这个 goroutine 不应该阻止其他 goroutine 的执行。然而,第一个 Goroutine 似乎以某种方式阻止了第二个 Goroutine 发送到超时通道。
解释
此行为是由于 Goroutine 的方式造成的安排在Go。使用协作调度,这意味着 Goroutine 必须自愿将执行交给调度程序才能让另一个 Goroutine 运行。在提供的代码中,具有无限循环的 goroutine 永远不会让步,这会阻止其他 goroutine 取得进展。
Goroutine 通常在以下条件下让步:
在这种情况下,这些条件都不满足,所以无限循环的goroutine继续运行
解决方案
要解决此问题,有几种可能的解决方案:
适合您的特定应用程序的最佳解决方案将取决于 goroutine 的性质和所需的行为。
以上是Go 中具有无限循环的 Goroutine 如何阻塞其他 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!