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()
}
复制代码