[go] 병렬 처리를 위한 sync 패키지의 기능

병렬 처리는 프로그램의 성능을 향상시키고 여러 가지 작업을 동시에 처리할 수 있는 중요한 기능입니다. Go 언어에서는 sync 패키지를 사용하여 병렬 처리를 지원합니다. 이 패키지에는 여러 가지 유용한 기능이 포함되어 있으며, 이를 통해 안전하고 효율적인 병렬 처리를 할 수 있습니다.

Mutex

sync.MutexMutual 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 언어의 강력한 기능 중 하나이며, 올바르게 활용하면 안정적이고 효율적인 프로그램을 개발할 수 있습니다.

참고 자료