[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 패키지를 사용하여 안정적인 동기화를 달성할 수 있습니다.

참고 문헌: