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()
}
複製代碼
相關文章
相關標籤/搜索