[go] sync 패키지를 이용한 고루틴간 통신

고루틴은 Go 언어의 강력한 기능 중 하나입니다. 고루틴은 가벼우며 동시성을 구현하기 위한 강력한 도구입니다. 이러한 고루틴 간에는 데이터를 안전하게 공유하고 통신해야 합니다.

Go의 sync 패키지는 이러한 통신을 쉽게 만들어주는 여러 도구들을 제공합니다. 이 패키지를 사용하여 여러 고루틴 간에 데이터를 안전하게 공유하고 조율할 수 있습니다.

Contents

  1. sync.Mutex를 사용한 공유 데이터 보호
  2. sync.WaitGroup을 이용한 고루틴 동기화
  3. sync.Once를 이용한 한 번만 실행

sync.Mutex를 사용한 공유 데이터 보호

sync.Mutex가 사용되면 데이터를 안전하게 공유할 수 있습니다. 어떤 고루틴이 공유 데이터를 사용할 때 다른 고루틴이 그 데이터에 접근하지 못하도록 보호합니다.

다음은 sync.Mutex를 사용하여 공유 데이터를 안전하게 보호하는 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
)

var count int
var mutex = &sync.Mutex{}

func increment() {
	mutex.Lock()
	defer mutex.Unlock()
	count++
	fmt.Println(count)
}

func main() {
	for i := 0; i < 5; i++ {
		go increment()
	}
	fmt.Scanln()
}

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

sync.WaitGroup을 사용하면 여러 고루틴이 동시에 실행되는 동안 모든 고루틴의 작업이 완료될 때까지 기다릴 수 있습니다.

다음은 sync.WaitGroup을 사용하여 고루틴 동기화하는 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done()
	fmt.Printf("Worker %d 시작\n", id)
	time.Sleep(time.Second)
	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.Once를 이용한 한 번만 실행

sync.Once를 사용하면 특정 함수를 단 한 번만 호출할 수 있습니다. 이것은 고루틴들 사이에 단 한 번 필요한 초기화를 위해 유용합니다.

다음은 sync.Once를 사용하여 특정 함수를 한 번만 실행하는 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
)

var once sync.Once

func initialize() {
	fmt.Println("초기화 함수 실행")
}

func main() {
	for i := 0; i < 3; i++ {
		once.Do(initialize)
	}
}

sync 패키지를 사용하면 안전하고 효율적인 방법으로 고루틴 간 통신을 구현할 수 있습니다.

참고 자료