[go] sync 패키지를 이용한 병렬 처리

병렬 처리는 성능을 향상시키고 프로그램의 처리 속도를 높이는 데에 유용합니다. Go 언어의 sync 패키지는 고루틴 간 통신과 공유 메모리 문제를 처리하는 데 있어 매우 유용합니다. 이번 포스트에서는 sync 패키지를 이용하여 병렬 처리를 하는 방법에 대해 알아보겠습니다.

sync 패키지 소개

sync 패키지는 동시성 프로그래밍에 필요한 도구들을 제공합니다. 이 패키지에는 여러 가지 동기화 기법과 공유 메모리를 안전하게 사용할 수 있는 도구들이 포함되어 있어, 안전하게 병렬 처리를 할 수 있습니다.

공유 메모리와 동기화

병렬 처리를 할 때 가장 중요한 문제 중 하나는 공유 메모리에 여러 고루틴이 동시에 접근할 때 발생하는 동기화 문제입니다. sync 패키지는 이러한 문제를 해결하기 위한 여러 가지 기능을 제공합니다.

공유 메모리 보호하기

sync.Mutex 타입을 사용하여 공유 메모리를 보호할 수 있습니다. 이를 통해 여러 고루틴이 공유 메모리에 안전하게 접근하고 수정할 수 있습니다.

package main

import (
	"fmt"
	"sync"
)

func main() {
	var mu sync.Mutex
	counter := 0

	for i := 0; i < 1000; i++ {
		go func() {
			mu.Lock()
			counter++
			mu.Unlock()
		}()
	}

	mu.Lock() // 모든 고루틴이 종료될 때까지 대기
	fmt.Println(counter)
	mu.Unlock()
}

위의 예제에서 sync.Mutex를 사용하여 counter 변수를 안전하게 갱신하고 출력할 수 있습니다.

웨이트그룹 활용하기

때로는 모든 고루틴이 작업을 완료할 때까지 기다려야 할 필요가 있습니다. 이 경우 sync.WaitGroup을 사용하여 모든 고루틴이 완료될 때까지 기다릴 수 있습니다.

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	counter := 0

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			counter++
		}()
	}

	wg.Wait() // 모든 고루틴이 종료될 때까지 대기
	fmt.Println(counter)
}

위의 예제에서 sync.WaitGroup을 사용하여 모든 고루틴이 종료될 때까지 기다린 후 counter 값을 출력할 수 있습니다.

결론

sync 패키지는 고루틴 간의 동기화와 공유 메모리 보호를 위한 강력한 도구를 제공합니다. 병렬 처리를 안전하게 하고 성능을 향상시키기 위해 sync 패키지를 적극적으로 활용해보세요.