Golang中不要使用無限迴圈檢查goroutine是否完成工作
阿新 • • 發佈:2018-12-31
在使用goroutine時,我們經常會寫出這樣的程式碼:
package main
import (
"fmt"
)
var (
flag bool
str string
)
func foo() {
flag = true
str = "setup complete!"
}
func main() {
go foo()
for !flag {
//按照我們的本意,foo()執行完畢後,flag=true,迴圈就會退出。
//但是其實這個迴圈永遠都不會退出
}
fmt.Println(str)
}
執行之後發現main中的無限迴圈永遠也無法退出,所以Go中不要用這種無限輪詢的方式來檢查goroutine是否完成了工作。
我們可以通過使用channel,讓foo()和main()實現通訊,讓foo()執行完畢後通過channel傳送一個訊息給main(),告訴它自己的事兒完成了,然後main()收到訊息後繼續執行其他操作:
package main import ( "fmt" ) var ( flag bool str string ) func foo(ch chan string) { flag = true str = "setup complete!" ch <- "I'm complete." //foo():我的任務完成了,發個訊息給你~ } func main() { ch := make(chan string) go foo(ch) <-ch //main():OK,收到你的訊息了~ for !flag { } fmt.Println(str) }
如果轉載請註明出處:http://blog.csdn.net/gophers/article/details/24472891