kok202
[2019.03.08] Go lang (Go routine, sync)

2019. 3. 8. 18:41[공부] 영상/GoLanguage

Go routine

Concurrency != Parallelism

Concurrenct : 코어 하나가 여러개의 스레드를 마치 동시에 돌리는 것 처럼 하는 것

Parallelism : 코어 여러개가 여러개의 스레드를 동시에 처리하는 것

함수 앞에 go 만 붙이면 됨

package main

import "time"
import "fmt"

func say(str string) {
    for i := 0; i < 3; i++ {
        fmt.Println(str)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    go say("Hello")
    say("World")
}


World
Hello
World
Hello
World
Hello




main 안의 모든 함수가 고루틴일 경우 아무것도 실행이 되지 않음 

func main() {
    go say("Hello")
    go say("World")
}

-> go routine 이 돌기도전에 프로그램이 끝나버려서 




그래서 이렇게 해도 되긴함

func main() {
    go say("Hello")
    go say("World")
    time.Sleep(time.Second)
}

그런데 이건 뭔가 나이스 하지 않음 -> Sync 시키자








Go routine Sync

package main

import "time"
import "fmt"
import "sync"

var waitGroup sync.WaitGroup

func say(str string) {
    for i := 0; i < 3; i++ {
        fmt.Println(str)
        time.Sleep(time.Millisecond * 100)
    }
    waitGroup.Done()
}

func main() {
    waitGroup.Add(1)
    go say("Hello")
    waitGroup.Add(1)
    go say("World")
    waitGroup.Wait()
}

waitGroup.Add()

waitGroup.Done()

waitGroup.Wait()

-> 좋은 방법이지만 함수가 에러로 끝날 경우 Done을 만나지 못하는 문제가 있다.








Go routine Sync Defer

package main

import "time"
import "fmt"
import "sync"

var waitGroup sync.WaitGroup

func say(str string) {
    defer waitGroup.Done()
    for i := 0; i < 3; i++ {
        fmt.Println(str)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    waitGroup.Add(1)
    go say("Hello")
    waitGroup.Add(1)
    go say("World")
    waitGroup.Wait()
}