728x90
반응형
Concurrency (동시성) 란 여러가지 작업을 동시에 처리하는 것을 말한다.
물론 CPU의 코어 갯수 및 현재 활성화 되어 있는 쓰레드 갯수에 따라 동작한다.
GO에서는 OS의 쓰레드에 의존하지 않고 (오버헤드가 크기 때문) goroutine이라는 별도의 경량쓰레드를 사용하여 동시성 문제를 해결한다.
package main
import (
"fmt"
"time"
)
var count int
func job() {
for i := 0; i < 50; i++ {
time.Sleep(time.Second / 10)
fmt.Printf("sub: %d\n", ++count)
}
}
func main() {
go job()
for i := 0; i < 100; i++ {
time.Sleep(time.Second / 10)
fmt.Printf("main: %d\n", ++count)
}
}
위의 main 함수에서 job() 함수를 호출하는 부분 왼쪽에 보이는 go 키워드가 goroutine 을 의미한다.
사용법은 간단하지만 OS의 쓰레드를 사용할 때와 같이 여러 goroutine이 공유 변수에 접근할 때 문제가 생길 수 있다.
이를 해결하기 위해 mutex 나 semaphore를 사용해야 한다.
그래야만 쓰레드가 Critical Section에 서로 접근하여 자원을 사용할 수 있기 때문이다.
package main
import (
"sync"
"fmt"
)
var total int
var wg sync.WaitGroup
var mutex sync.Mutex
func main() {
wg.Add(100)
for i := 0; i < 100; i++ {
go func() {
mutex.Lock()
inc := total
inc++
total = inc
mutex.Unlock()
wg.Done()
}()
}
wg.Wait()
fmt.Println(total)
}
하지만 go에서는 이부분 마저도 쉽게 사용하기 위해 channel 을 사용한다.
channel은 다음 글에 설명하도록 하겠다.
728x90
반응형
댓글