[go] sync 패키지를 이용한 동시성 디자인 패턴

Go 언어의 동시성 처리는 sync 패키지를 이용하여 쉽게 구현할 수 있습니다. 이번 포스트에서는 sync 패키지를 사용하여 가장 일반적으로 사용되는 세 가지 동시성 디자인 패턴에 대해 알아보겠습니다.

  1. Mutex Lock
  2. WaitGroup
  3. Channel

Mutex Lock

Mutex Lock은 공유 자원에 여러 고루틴이 동시에 접근하는 것을 막기 위해 사용됩니다. 아래는 Mutex Lock을 사용한 간단한 예제입니다.

package main

import (
	"fmt"
	"sync"
)

var (
	counter = 0
	mutex   sync.Mutex
)

func incrementCounter() {
	mutex.Lock()
	defer mutex.Unlock()
	counter++
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			incrementCounter()
		}()
	}
	wg.Wait()
	fmt.Println("Counter:", counter)
}

WaitGroup

WaitGroup은 여러 고루틴이 모두 작업을 마치기를 기다릴 수 있는 동시성 디자인 패턴입니다.

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			fmt.Printf("Worker %d 시작\n", id)
		}(i)
	}
	wg.Wait()
	fmt.Println("모든 Worker가 종료됨")
}

Channel

Channel은 고루틴 사이의 통신을 위한 기능으로, 데이터를 안전하게 전달할 수 있습니다. 아래는 Channel을 사용한 예제입니다.

package main

import (
	"fmt"
)

func main() {
	c := make(chan string)
	go func() {
		c <- "안녕, Channel!"
		close(c)
	}()
	msg, ok := <-c
	if ok {
		fmt.Println(msg)
	}
}

위 예제를 통해 세 가지 sync 패키지 동시성 디자인 패턴에 대한 기본적인 이해를 할 수 있습니다. 이 패턴들은 Go 언어의 강력한 동시성 처리를 효율적으로 구현하는 데 도움이 됩니다.

이 글은 https://golang.org/pkg/sync/ 를 참고하여 작성되었습니다.