동시성
1. 동시성 vs 병렬성¶
1.5 go 키워드와 goroutine¶
package main
import (
"fmt"
)
func main() {
foo()
bar()
}
func foo() {
for i := 0; i < 10; i++ {
fmt.Println("foo:", i)
}
}
func bar() {
for i := 0; i < 10; i++ {
fmt.Println("bar:", i)
}
}
위 코드를 병렬적으로 만들어보자!
그전에 go 의 유용한 기능을 사용해보자.
func main() {
fmt.Println("OS \t : ", runtime.GOOS)
fmt.Println("ARCH \t : ", runtime.GOARCH)
fmt.Println("CPUs \t : ", runtime.NumCPU())
fmt.Println("Goroutines \t : ", runtime.NumGoroutine())
}
그럼 이제 goroutine 을 이용해 위 코드가 동시성을 가지도록 해보자.
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("OS \t\t : ", runtime.GOOS)
fmt.Println("ARCH \t\t : ", runtime.GOARCH)
fmt.Println("CPUs \t\t : ", runtime.NumCPU())
fmt.Println("Goroutines \t : ", runtime.NumGoroutine())
go foo()
bar()
fmt.Println("CPUs \t\t : ", runtime.NumCPU())
fmt.Println("Goroutines \t : ", runtime.NumGoroutine())
}
func foo() {
for i := 0; i < 5; i++ {
fmt.Println("foo:", i)
}
}
func bar() {
for i := 0; i < 5; i++ {
fmt.Println("bar:", i)
}
}
실행 결과
OS : linux
ARCH : amd64
CPUs : 8
Goroutines : 1
bar: 0
bar: 1
bar: 2
bar: 3
bar: 4
CPUs : 8
Goroutines : 2
위 코드는 동시성을 가진다. (goroutine 이 2가됨) 또한 foo 출력이 사라졌다!
왜 와이? 그리고 goroutine 이 뭐지? 쓰레드 같은건가?!
2. WaitGroup¶
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func main() {
fmt.Println("OS \t\t : ", runtime.GOOS)
fmt.Println("ARCH \t\t : ", runtime.GOARCH)
fmt.Println("CPUs \t\t : ", runtime.NumCPU())
fmt.Println("Goroutines \t : ", runtime.NumGoroutine())
wg.Add(1)
go foo()
bar()
fmt.Println("CPUs \t\t : ", runtime.NumCPU())
fmt.Println("Goroutines \t : ", runtime.NumGoroutine())
wg.Wait()
}
func foo() {
for i := 0; i < 5; i++ {
fmt.Println("foo:", i)
}
wg.Done()
}
func bar() {
for i := 0; i < 5; i++ {
fmt.Println("bar:", i)
}
}
실행 결과
OS : linux
ARCH : amd64
CPUs : 8
Goroutines : 1
bar: 0
bar: 1
bar: 2
bar: 3
bar: 4
CPUs : 8
Goroutines : 2
foo: 0
foo: 1
foo: 2
foo: 3
foo: 4
3. 다시보는 WaitGroup¶
Last update:
May 31, 2023
Created: May 28, 2023
Created: May 28, 2023