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()
}