[go] sync 패키지를 이용한 병행성 제어
병행성은 현대 소프트웨어 시스템에서 매우 중요한 요소입니다. Go 언어는 병행성을 강력하게 지원하며, sync
패키지를 통해 고루틴들 간의 동기화와 공유 자원 관리를 할 수 있습니다. 이번 포스트에서는 sync
패키지를 사용하여 병행성을 제어하는 방법에 대해 알아보겠습니다.
WaitGroup을 사용한 고루틴 관리
sync.WaitGroup
은 여러 고루틴이 모두 실행을 마칠 때까지 대기할 수 있도록 해주는 도구입니다. 아래는 sync.WaitGroup
을 사용하여 고루틴을 관리하는 간단한 예제 코드입니다.
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Println("고루틴", id, "실행 중")
}(i)
}
wg.Wait()
fmt.Println("모든 고루틴이 실행 완료됨")
}
위의 예제 코드에서 sync.WaitGroup
을 사용하여 5개의 고루틴이 모두 실행을 마칠 때까지 기다리고, 마지막에 “모든 고루틴이 실행 완료됨”을 출력합니다.
Mutex를 사용한 공유 자원 보호
sync.Mutex
는 공유 자원에 대한 접근을 제어하기 위해 사용됩니다. 아래는 sync.Mutex
를 사용하여 공유 자원을 보호하는 예제 코드입니다.
package main
import (
"fmt"
"sync"
)
var (
counter = 0
mutex sync.Mutex
)
func incrementCounter() {
mutex.Lock()
defer mutex.Unlock()
counter++
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
incrementCounter()
}()
}
wg.Wait()
fmt.Println("최종 카운터 값:", counter)
}
위의 예제 코드에서 sync.Mutex
를 사용하여 counter
변수에 대한 접근을 보호하고, 10개의 고루틴이 incrementCounter
함수를 안전하게 호출하도록 합니다.
정리
Go 언어의 sync
패키지를 사용하면 병행성을 효율적으로 제어할 수 있습니다. sync.WaitGroup
을 사용하여 고루틴의 동시 실행 완료를 기다리고, sync.Mutex
를 사용하여 공유 자원을 안전하게 보호할 수 있습니다. 이러한 기능들을 적절히 활용하여 안정적이고 효율적인 병행 프로그램을 개발할 수 있습니다.
더 자세한 내용은 Go 공식 문서를 참조하세요.