如何在不阻塞的情况下判断 Goroutine 是否完成?
在 Go 语言中,判断一个 Goroutine 是否完成,通常需要通过 channel 进行通信。然而,直接从 channel 接收数据 (
"Comma, Ok" 模式
Go 语言的 "comma, ok" 模式允许在从 channel 接收数据时,同时获取一个布尔值,指示 channel 是否已关闭。如果 channel 已经关闭,该布尔值为 false;否则,为 true。
以下是一个示例:
package main import ( "fmt" "time" ) func worker(ch chan int) { defer close(ch) // Goroutine 完成后关闭 channel time.Sleep(2 * time.Second) ch <- 123 // 向 channel 发送数据 } func main() { ch := make(chan int) go worker(ch) // 非阻塞地检查 Goroutine 是否完成 for { select { case val, ok := <-ch: if ok { fmt.Println("Received:", val) fmt.Println("Goroutine is still running.") } else { fmt.Println("Channel is closed.") fmt.Println("Goroutine has finished.") return } default: fmt.Println("No data available yet, checking again...") time.Sleep(500 * time.Millisecond) // 避免 CPU 占用过高 } } }
登录后复制
文章作者:磁力搜索
文章标题:如何在不阻塞的情况下判断 Goroutine 是否完成?
文章链接:https://onehaoka.com/6104.html
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自磁力搜索 !
文章标题:如何在不阻塞的情况下判断 Goroutine 是否完成?
文章链接:https://onehaoka.com/6104.html
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自磁力搜索 !
还没收到回复