[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()
}
'[공부] 영상 > GoLanguage' 카테고리의 다른 글
[2019.03.08] Go lang (Channel, Close) (0) | 2019.03.08 |
---|---|
[2019.03.08] Go lang (Html template) (0) | 2019.03.08 |
[2019.03.08] Go lang (Map, Defer, Panic, Recover) (0) | 2019.03.08 |
[2019.03.08] Go lang (Struct) (0) | 2019.03.08 |
[2019.03.08] Go lang (서버 제작) (0) | 2019.03.08 |