1. time.Sleep()
// 簡單循環 time.Sleep() 能夠等待其餘主線程執行完畢,在執行主線程,在進行其餘操做, 可是當數據量太大,循環數據較多,執行時間較長的時候,就不能達到效果。致使其餘主線程還沒執行完畢,主線程進行下一步操做。就會致使循環內部操做沒有充分執行。
package main
import (
"fmt"
"time"
)
func main(){
for i := 0; i < 100 ; i++{
go fmt.Println(i)
}
time.Sleep(time.Second)
}
複製代碼
2. sync.WaitGroup
// sync.WaitGroup 提供 Add() 計數設置, , Wait() 主函數中使用Wait() 一直阻塞,直到 計數器到0, Done() 每次把計數器-1, 三個方法
package main
import (
"fmt"
"time"
"sync"
)
var (
sync sync.WaitGroup
)
func main(){
n := 1000
sync.Add(n)
for i := 0; i <= n; i++ {
// 須要執行的操做
go func(i int) {
fmt.Println(i)
sync.Done()
}(i)
}
sync.Wait()
}
複製代碼
sync.WaitGroup必定要經過指針傳值,否則進程會進入死鎖狀態
package main
import (
"fmt"
"sync"
)
func main() {
sync := sync.WaitGroup{}
n := 1000
sync.Add(n)
for i := 0; i <= n; i++ {
// 須要執行的操做
go f(i, &sync)
}
sync.Wait()
}
func f(i int, sync *sync.WaitGroup) {
fmt.Println(i)
wg.Done()
}
複製代碼