goroutine 실행과 goroutine의sync.WaitGroup 역할

13027 단어 Go

goroutine 실행


아래와 같다
"100*time. Millisecond당 5번 Hello를 표시하는 방법sayhello와 100*time. Millisecond당 5번 세계를 표시하는 방법 goroutine"
에서 설명한 방법의 대체 방법입니다.
main.go
package main

import (
    "fmt"
    "time"
)

func sayworld(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func sayhello(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    sayworld("world")
    sayhello("hello")
}
//出力結果
// world
// world
// world
// world
// world
// hello
// hello
// hello
// hello
// hello
이것은 병행 처리가 아니기 때문에 당연히 위에서 아래로 순서대로'sayworld방법=>sayhello방법'의 순서에 따라 실행한다.
그러면 Go에서 어떻게 병행 처리합니까 (sayworld 방법과sayhello 방법을 동시에 실행합니까).
sayworld 방법 전에 go를 추가하면 됩니다.
main.go
package main

import (
    "fmt"
    "time"
)

func sayworld(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func sayhello(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    //sayworldを別スレッドでgoroutineとして同時実行
    go sayworld("world")
    sayhello("hello")
}
//出力結果
// world
// hello
// hello
// world
// world
// hello
// hello
// world
// world
// hello

이렇게 하면 Go에서 주 라인에서 실행되는 함수와 동시에 실행되는 함수에 go를 더하면 병렬 처리가 가능하다.

sync.WaitGroup 역할


다음은 타임.Sleep(100*time.Millisecond)에 대한 설명을 시도합니다.
main.go
package main

import (
    "fmt"
    _ "time"
)

func sayworld(s string) {
    for i := 0; i < 5; i++ {
        // time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func sayhello(s string) {
    for i := 0; i < 5; i++ {
        // time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    //sayworldを別スレッドで同時実行
    go sayworld("world")
    sayhello("hello")
}
//出力結果
// hello
// hello
// hello
// hello
// hello
그래서 병행 처리해야 할sayworld 방법은 실행되지 않고 sayhello만 실행됩니다.
메인 라인의sayhello가'sayworld가goroutine로 시작=> 실행'하기 전에 끝났기 때문입니다.

즉,'sayworld가goroutin으로 시작하기=> 실행'을 기다리면 됩니다.
이것은 wgsync입니다.WaitGroup 사용
  • wg.Add(n)에서 n 개의 병렬 처리가 있음을 전달합니다
  • wg.Wait()에서 병렬 처리가 끝날 때까지(wg.Done()에서 처리가 중단되지 않습니다
  • main.go
    package main
    
    import (
        "fmt"
        "sync"
    )
    
    //引数にwgのポインタを宣言
    func sayworld(s string, wg *sync.WaitGroup) {
        //wg.Done()で処理の終了を伝える(deferで関数の最後に実行する)
        defer wg.Done()
        for i := 0; i < 5; i++ {
            fmt.Println(s)
        }
    }
    
    func sayhelllo(s string) {
        for i := 0; i < 5; i++ {
            fmt.Println(s)
        }
    }
    
    func main() {
        var wg sync.WaitGroup
        //wg.Add(n)でwgにn個の並列処理があるということを伝える
        wg.Add(1)
        //実行したいgoroutineにwgのアドレスを渡す
        go sayworld("world", &wg)
        sayhelllo("hello")
        //「goroutinの処理がwg.Done()されるまで終了しないで」と言うことをwg.Wait()で伝える
        wg.Wait()
    }
    
    //出力結果
    // hello
    // hello
    // hello
    // hello
    // hello
    // world
    // world
    // world
    // world
    // world
    
    
    이렇게 해서main 라인과goroutin을 믿음직스럽게 병행 처리합니다

    좋은 웹페이지 즐겨찾기