go sync.WaitGroup, time.Sleep方法 线程处理

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()
}
复制代码
相关文章
相关标签/搜索