Golang涓殑鏁版嵁骞跺彂澶勭悊鍜孏o WaitGroup
Golang涓殑鏁版嵁骞跺彂澶勭悊鍙互閫氳繃浣跨敤goroutine鍜宑hannel鏉ュ疄鐜般€侴oroutine鏄竴绉嶈交閲忕骇鐨勭嚎绋嬶紝鍙互鍦ㄥ嚱鏁板墠娣诲姞go鍏抽敭瀛楁潵鍚姩涓€涓猤oroutine銆侰hannel鏄敤浜巊oroutine涔嬮棿杩涜閫氫俊鍜屾暟鎹紶閫掔殑鏁版嵁缁撴瀯銆?/p>
涓嬮潰鏄竴涓畝鍗曠殑绀轰緥锛屾紨绀哄浣曢€氳繃goroutine鍜宑hannel瀹炵幇鏁版嵁骞跺彂澶勭悊锛?/p>
func processData(data []int, result chan int) {
// 澶勭悊鏁版嵁
sum := 0
for _, value := range data {
sum += value
}
result <- sum
}
func main() {
data := []int{1, 2, 3, 4, 5}
result := make(chan int)
go processData(data[:len(data)/2], result)
go processData(data[len(data)/2:], result)
// 绛夊緟涓や釜goroutine閮藉畬鎴?total := <-result + <-result
fmt.Println("Total sum:", total)
}
鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鎴戜滑灏嗘暟鎹垎鎴愪袱閮ㄥ垎锛屽苟鍦ㄤ袱涓猤oroutine涓鐞嗐€傛瘡涓猤oroutine閮藉皢閮ㄥ垎鏁版嵁鐨勫拰鍙戦€佸埌result閫氶亾涓€傛渶鍚庯紝閫氳繃浠庨€氶亾涓鍙栦袱涓粨鏋滃苟姹傚拰锛屾垜浠緱鍒颁簡鎬诲拰銆?/p>
鍦℅o涓紝濡傛灉鏈夊涓猤oroutine杩愯锛屽苟涓旀垜浠渶瑕佺瓑寰呭畠浠叏閮ㄥ畬鎴愬悗鍐嶇户缁墽琛岋紝鍙互浣跨敤WaitGroup銆俉aitGroup鏄疓o鎻愪緵鐨勪竴绉嶅悓姝ュ師璇紝鐢ㄤ簬绛夊緟涓€缁刧oroutine瀹屾垚銆?/p>
涓嬮潰鏄竴涓娇鐢╓aitGroup鐨勭ず渚嬶細
func processData(data []int, result chan int, wg *sync.WaitGroup) {
defer wg.Done()
// 澶勭悊鏁版嵁
sum := 0
for _, value := range data {
sum += value
}
result <- sum
}
func main() {
data := []int{1, 2, 3, 4, 5}
result := make(chan int)
var wg sync.WaitGroup
wg.Add(2) // 娣诲姞涓や釜goroutine鍒癢aitGroup
go processData(data[:len(data)/2], result, &wg)
go processData(data[len(data)/2:], result, &wg)
go func() {
wg.Wait() // 绛夊緟鎵€鏈塯oroutine瀹屾垚
close(result)
}()
// 浠庨€氶亾涓鍙栫粨鏋?total := 0
for value := range result {
total += value
}
fmt.Println("Total sum:", total)
}
鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鎴戜滑浣跨敤sync搴撲腑鐨刉aitGroup鏉ヨ繘琛実oroutine鐨勫悓姝ャ€傞鍏堬紝鎴戜滑鍦╩ain鍑芥暟涓垱寤轰竴涓猈aitGroup锛屽苟浣跨敤Add鏂规硶灏嗗緟绛夊緟鐨刧oroutine鏁伴噺璁剧疆涓?銆傜劧鍚庯紝鍦ㄦ瘡涓猤oroutine鐨勬湯灏撅紝鎴戜滑璋冪敤Done鏂规硶鏉ヨ〃绀鸿goroutine宸茬粡瀹屾垚銆傛渶鍚庯紝鎴戜滑浣跨敤Wait鏂规硶绛夊緟鎵€鏈夌殑goroutine瀹屾垚銆?/p>
闇€瑕佹敞鎰忕殑鏄紝鎴戜滑浣跨敤浜嗕竴涓尶鍚嶇殑goroutine鏉ョ瓑寰呮墍鏈夌殑goroutine瀹屾垚锛岀劧鍚庡叧闂璻esult閫氶亾銆傚湪涓诲嚱鏁颁腑锛屾垜浠娇鐢╮ange寰幆浠巖esult閫氶亾涓鍙栫粨鏋滐紝骞惰绠楀嚭鎬诲拰銆?/p>
杩欏氨鏄湪Golang涓繘琛屾暟鎹苟鍙戝鐞嗕互鍙婁娇鐢╓aitGroup鐨勫熀鏈柟娉曘€傞€氳繃goroutine鍜宑hannel锛屾垜浠彲浠ユ柟渚垮湴瀹炵幇骞跺彂澶勭悊锛屽苟涓旈€氳繃WaitGroup鍙互纭繚鎵€鏈夌殑goroutine閮藉畬鎴愬悗鍐嶈繘琛屼笅涓€姝ユ搷浣溿€?/p>
相关问答