[go] sync 패키지를 사용한 분산 시스템 구현
분산 시스템에서는 여러 작업을 동시에 처리해야 합니다. 이때 동기화가 필요한데, Golang에서는 sync
패키지를 이용하여 간단하게 구현할 수 있습니다.
WaitGroup을 이용한 동시성 제어
sync.WaitGroup
은 고루틴의 동작을 동기화하는 데 사용됩니다. 다음은 sync.WaitGroup
을 사용하여 간단한 예제를 구현한 것입니다.
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
time.Sleep(time.Second * time.Duration(i))
fmt.Printf("Job %d is done\n", n)
}(i)
}
wg.Wait()
fmt.Println("All jobs are done")
}
위의 코드는 3개의 고루틴을 생성하여 각각 다른 시간이 소요될 때까지 대기하도록 합니다. sync.WaitGroup
을 이용하여 모든 고루틴의 작업이 완료되길 기다린 후 “All jobs are done”을 출력합니다.
Mutex를 이용한 상태 공유
또 다른 예로, sync.Mutex
를 사용하여 상태 공유를 동기화할 수 있습니다.
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
위 코드는 sync.Mutex
를 이용하여 counter
변수를 안전하게 증가시키는 예제입니다.
sync
패키지를 활용하여 고루틴 간 동기화를 쉽게 구현할 수 있습니다. 복잡한 분산 시스템에서도 sync
패키지를 사용하여 안정적인 동기화를 달성할 수 있습니다.
참고 문헌:
- Go 언어 공식 문서 - sync 패키지
- Donovan, A. A. & Kernighan, B. W. (2015). The Go Programming Language. Addison-Wesley.