[go] sync 패키지의 동시성 관련 best practice

동시성을 처리하는 것은 Go 언어의 강점 중 하나입니다. 이때, sync 패키지는 고루틴 간의 동기화와 상호작용을 담당하며, 쉽게 사용할 수 있는 여러 도구와 기능을 제공합니다. 이번 글에서는 sync 패키지를 사용할 때의 best practice를 알아보겠습니다.

1. 공유 자원 접근 시 동시성 고려

동시에 여러 고루틴에서 공유 자원에 접근할 때는 상호배제가 필요합니다. 이를 위해 sync.Mutex 타입을 사용하여 접근을 제어합니다.

var mu sync.Mutex
var sharedData int

func updateSharedData(newValue int) {
    mu.Lock()
    defer mu.Unlock()
    
    sharedData = newValue
}

위의 예시에서 sync.Mutex를 사용하여 sharedData에 동시에 여러 고루틴이 접근하는 것을 막고 있습니다.

2. WaitGroup을 이용한 고루틴 동기화

여러 고루틴이 실행을 완료할 때까지 기다렸다가 다음 동작을 수행해야 할 경우에는 sync.WaitGroup을 사용합니다.

var wg sync.WaitGroup

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go process(i)
    }

    wg.Wait()
    fmt.Println("모든 고루틴이 완료되었습니다.")
}

func process(i int) {
    defer wg.Done()
    
    // 작업 수행
}

위의 예제에서 sync.WaitGroup을 사용하여 모든 고루틴이 완료될 때까지 기다린 후, 다음 동작을 수행하도록 하고 있습니다.

3. 고루틴 간 통신을 위한 채널 활용

고루틴 간에 안전하게 데이터를 전달하고 통신하기 위해 채널 (Channel)을 사용합니다.

ch := make(chan int)

go func() {
    ch <- 42
}()

result := <-ch

위의 예시에서 채널을 사용하여 고루틴 간 안전하게 데이터를 주고받고 있습니다.

결론

sync 패키지는 동시성을 다룰 때 중요한 기능과 도구를 제공합니다. 이를 통해 고루틴 간의 동기화, 상호작용 및 통신을 안전하게 처리할 수 있습니다.

참고: Go 공식 문서 - sync 패키지

위에서 언급한 패턴들은 sync 패키지를 사용할 때의 best practice이며, 개발자가 동시성을 다룰 때 참고할 수 있는 중요한 지침이 될 것입니다.