1. 程式人生 > >Golang中不要使用無限迴圈檢查goroutine是否完成工作

Golang中不要使用無限迴圈檢查goroutine是否完成工作

在使用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