[go] 병렬 처리를 위한 sync 패키지의 기능
병렬 처리는 프로그램의 성능을 향상시키고 여러 가지 작업을 동시에 처리할 수 있는 중요한 기능입니다. Go 언어에서는 sync
패키지를 사용하여 병렬 처리를 지원합니다. 이 패키지에는 여러 가지 유용한 기능이 포함되어 있으며, 이를 통해 안전하고 효율적인 병렬 처리를 할 수 있습니다.
Mutex
sync.Mutex
는 Mutual Exclusion의 약자로, 고루틴 간의 상호배타적인 실행을 보장하는 데 사용됩니다. 이를 통해 동시에 여러 고루틴이 접근하는 경우 발생할 수 있는 데이터 레이스 등의 문제를 효과적으로 해결할 수 있습니다. 다음은 sync.Mutex
의 예시 코드입니다.
package main
import (
"fmt"
"sync"
)
var (
counter = 0
mu sync.Mutex
)
func incrementCounter(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
defer mu.Unlock()
counter++
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go incrementCounter(&wg)
}
wg.Wait()
fmt.Println("Counter:", counter)
}
이 예시 코드에서는 sync.Mutex
를 사용하여 counter
변수에 안전하게 접근하고 증가시키고 있습니다.
WaitGroup
sync.WaitGroup
은 고루틴이 모두 작업을 완료할 때까지 대기할 수 있도록 도와주는 것으로, 병렬 처리 작업의 완료를 동기화하는 데 유용합니다. 다음은 sync.WaitGroup
의 예시 코드입니다.
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d 시작\n", id)
// 실제 작업 수행
fmt.Printf("Worker %d 완료\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("모든 Worker 작업 완료")
}
위 예시 코드에서는 sync.WaitGroup
을 사용하여 여러 고루틴이 모든 작업을 완료할 때까지 기다리도록 하고 있습니다.
이 외에도 sync
패키지에는 Once
, Pool
등의 유용한 기능이 포함되어 있어, 다양한 상황에서 안전하고 효율적인 병렬 처리를 위한 도구로 활용될 수 있습니다.
병렬 처리를 위한 sync
패키지는 Go 언어의 강력한 기능 중 하나이며, 올바르게 활용하면 안정적이고 효율적인 프로그램을 개발할 수 있습니다.
참고 자료
- Go 언어 공식 문서 - sync 패키지
- Donovan, Alan A.A. & Kernighan, Brian W. (2015). “The Go Programming Language”. Addison-Wesley Professional.