骞跺彂鎺у埗瀹炰緥瑙f瀽锛欸olang涓娇鐢℅o WaitGroup瀹屾垚浠诲姟
鍦℅olang涓紝鎴戜滑鍙互浣跨敤sync
鍖呬腑鐨?code>WaitGroup鏉ュ疄鐜板苟鍙戞帶鍒躲€?code>WaitGroup鐢ㄤ簬绛夊緟涓€缁刧oroutine瀹屾垚鎵ц銆?/p>
涓嬮潰鏄竴涓娇鐢?code>WaitGroup鏉ュ畬鎴愪换鍔$殑绀轰緥锛?/p>
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 璁剧疆瑕佹墽琛岀殑浠诲姟鏁伴噺
taskCount := 5
wg.Add(taskCount)
for i := 1; i <= taskCount; i++ {
go performTask(i, &wg)
}
// 绛夊緟鎵€鏈変换鍔″畬鎴?/span>
wg.Wait()
fmt.Println("鎵€鏈変换鍔″凡瀹屾垚")
}
func performTask(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("寮€濮嬫墽琛屼换鍔?%d\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("浠诲姟 %d 瀹屾垚\n", id)
}
鍦ㄤ笂闈㈢殑绀轰緥涓紝鎴戜滑棣栧厛鍒涘缓浜嗕竴涓?code>WaitGroup瀹炰緥wg
锛岀劧鍚庤缃鎵ц鐨勪换鍔℃暟閲忎负5锛岄€氳繃璋冪敤wg.Add(taskCount)
鏂规硶鏉ュ鍔犵瓑寰呯殑goroutine鏁伴噺銆?/p>
鎺ヤ笅鏉ワ紝鎴戜滑浣跨敤涓€涓惊鐜潵鍒涘缓5涓猤oroutine锛屽苟灏嗘瘡涓猤oroutine鐨勪换鍔D鍜?code>WaitGroup瀹炰緥鐨勬寚閽堜紶閫掔粰performTask
鍑芥暟銆?/p>
鍦?code>performTask鍑芥暟涓紝鎴戜滑浣跨敤defer
鍏抽敭瀛楁潵纭繚鍦ㄥ嚱鏁版墽琛屽畬鎴愬悗璋冪敤wg.Done()
鏂规硶锛岃〃绀轰换鍔″凡瀹屾垚銆?/p>
鍦ㄦ瘡涓猤oroutine涓紝鎴戜滑棣栧厛鎵撳嵃鍑轰换鍔″紑濮嬫墽琛岀殑淇℃伅锛岀劧鍚庨€氳繃time.Sleep
鍑芥暟妯℃嫙浠诲姟鎵ц鐨勬椂闂淬€傛渶鍚庯紝鎴戜滑鎵撳嵃鍑轰换鍔″畬鎴愮殑淇℃伅銆?/p>
鏈€鍚庯紝鎴戜滑璋冪敤wg.Wait()
鏂规硶鏉ョ瓑寰呮墍鏈夌殑goroutine瀹屾垚浠诲姟銆備竴鏃︽墍鏈夌殑goroutine閮借皟鐢ㄤ簡wg.Done()
鏂规硶锛?code>Wait鏂规硶灏变細杩斿洖锛岀▼搴忕户缁墽琛屽悗闈㈢殑浠g爜銆?/p>
杩愯涓婇潰鐨勪唬鐮侊紝浣犱細鐪嬪埌绫讳技涓嬮潰鐨勮緭鍑猴細
寮€濮嬫墽琛屼换鍔?1
寮€濮嬫墽琛屼换鍔?2
寮€濮嬫墽琛屼换鍔?3
寮€濮嬫墽琛屼换鍔?4
寮€濮嬫墽琛屼换鍔?5
浠诲姟 3 瀹屾垚
浠诲姟 1 瀹屾垚
浠诲姟 4 瀹屾垚
浠诲姟 5 瀹屾垚
浠诲姟 2 瀹屾垚
鎵€鏈変换鍔″凡瀹屾垚
浠庤緭鍑哄彲浠ョ湅鍑猴紝5涓换鍔℃槸骞跺彂鎵ц鐨勶紝浣嗘槸鏈€鍚庣殑杈撳嚭琛ㄦ槑鎵€鏈夌殑浠诲姟閮藉凡瀹屾垚銆?/p>
浣跨敤WaitGroup
鏉ュ畬鎴愪换鍔$殑骞跺彂鎺у埗锛屽畠鍙互纭繚鍦ㄦ墍鏈夌殑goroutine鎵ц瀹屾垚涔嬪墠锛屼富goroutine浼氫竴鐩寸瓑寰呫€傝繖鍦ㄩ渶瑕佺瓑寰呬竴缁刧oroutine瀹屾垚鎵ц鍚庡啀杩涜鍚庣画鎿嶄綔鐨勫満鏅腑闈炲父鏈夌敤銆?/p>
相关问答