golang sync.WaitGroup 사용

11146 단어 golang
간단한 협정을 집행하다
package main

import (
    "fmt"
    "time"
)

func main(){
    for i := 0; i < 100 ; i++{
        go fmt.Println(i)
    }
    time.Sleep(time.Second)
}

분석:
왜 슬립이 있을까요? 메인 라인은 고로틴이 모두 실행되기를 기다리기 위해 프로그램의 끝에 타임을 사용해야 합니다.슬립()은 다른 스레드가 충분히 작동할 때까지 일정 시간 수면을 취합니다.간단한 코드 100개의 for 순환은 1초 안에 실행할 수 있지만 실제 장면에서는 대부분 1초가 부족하다. 그리고 대부분의 시간에 우리는 for 순환 내의 코드 운행 시간의 장단을 예측할 수 없기 때문에 이럴 때는 시간을 사용할 수 없다.sleep () 에서 대기 작업을 완료했습니다.
파이핑을 사용하여 작업 완료
func main() {
    c := make(chan bool, 100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            c  true
        }(i)
    }

    for i := 0; i < 100; i++ {
        c
    }
}

통로는 완전히 목적을 달성할 수 있지만, 여기서는 파이프가 쓸모가 있을 것이다. 왜냐하면 이것은 단순히 동기화 처리만 하는 것이 아니라, 여기서 파이프를 사용하는 것은 사실상 적합하지 않기 때문이다.그리고 만약에 우리가 만, 10만, 심지어 더 많은 for 순환을 가지고 있다고 가정해도 같은 수량의 파이프를 신청해야 하고 메모리에 대한 비용도 적지 않다
이런 경우 go 언어에는 다른 도구가 있습니다.sync.Wait Group은 이 목적을 더욱 편리하게 달성할 수 있다.WaitGroup 대상 내부에 타이머가 있는데 처음에는 0부터 3가지 방법이 있습니다. Add (), Done (), Wait () 는 계수기의 수량을 조절하는 데 사용됩니다.Add (n) 는 계수기를 n으로 설정하고, Done () 는 계수기의 값이 0으로 줄어들 때까지 매번 계수기-1,wait () 는 코드의 운행을 막는다.
위 코드를 수정하려면 다음과 같이 하십시오.
func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

여기에 계수기를 100으로 설정하면 모든 for 순환이 끝날 때까지 계수기를 1 주 함수에서 Wait () 를 사용하여 wg가 0이면 모든 100개의 for 순환이 끝날 때까지 막습니다. 파이프를 사용하는 것보다 Wait Group이 훨씬 가볍습니다.
주의사항waitGroup 사용
카운터는 음수가 될 수 없습니다.
우리는 Add () 를 사용하여 wg에 마이너스 값을 설정할 수 없습니다. 그렇지 않으면 코드가 잘못될 수 있습니다
panic: sync: negative WaitGroup counter

goroutine 1 [running]:
sync.(*WaitGroup).Add(0xc042008230, 0xffffffffffffff9c)
    D:/Go/src/sync/waitgroup.go:75 +0x1d0
main.main()
    D:/code/go/src/test-src/2-Package/sync/waitgroup/main.go:10 +0x54

마찬가지로done()를 사용해도 계수기의 값을 마이너스로 설정하지 않도록 주의해야 한다
WaitGroup 객체는 참조 유형이 아니므로 함수를 통해 값을 전달할 때 주소를 사용해야 합니다.
waitGroup 대상은 인용 형식이 아닙니다. 함수를 통해 값을 전달할 때 주소를 사용해야 합니다
func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go f(i, &wg)
    }
    wg.Wait()
}

//          ,           
func f(i int, wg *sync.WaitGroup) { 
    fmt.Println(i)
    wg.Done()
}

좋은 웹페이지 즐겨찾기