[go] 고루틴과 sync 패키지의 함께 사용법

고루틴과 sync 패키지는 Go 언어에서 동시성을 처리하는 데 매우 유용한 도구입니다. 고루틴은 가벼운 스레드처럼 동작하며, 병행성 작업을 처리하는 데 도움이 됩니다. 한편, sync 패키지는 동시성 작업에서의 데이터 공유와 접근을 안전하게 관리하는 데 사용됩니다. 본 블로그에서는 고루틴과 sync 패키지를 함께 사용하여 데이터 동기화와 공유하는 방법에 대해 설명하겠습니다.

목차

  1. 고루틴(Goroutine) 소개
  2. sync 패키지 사용하기
  3. 고루틴과 sync 패키지 함께 활용하기
  4. 결론

1. 고루틴(Goroutine) 소개

고루틴은 Go 언어의 경량 스레드로, 함수를 동시에 실행하여 병행성을 처리하는 데 사용됩니다. 고루틴은 go 키워드를 사용하여 함수를 호출할 때 생성됩니다.

func main() {
    go worker() // 고루틴 시작
    // ...
}

func worker() {
    // 고루틴에서 수행할 작업
}

고루틴을 사용하면 여러 작업을 병렬로 처리할 수 있으며, 채널을 통해 데이터를 안전하게 공유할 수 있습니다.

2. sync 패키지 사용하기

sync 패키지는 고루틴 간의 데이터 공유와 접근을 안전하게 처리하기 위한 기능을 제공합니다. 가장 자주 사용되는 기능으로는 sync.Mutexsync.WaitGroup이 있습니다.

sync.Mutex는 공유 데이터에 대한 잠금을 제공하여 여러 고루틴이 안전하게 데이터에 접근하도록 합니다.

var mu sync.Mutex

func someFunc() {
    mu.Lock()
    // 공유 데이터 조작
    mu.Unlock()
}

sync.WaitGroup은 여러 고루틴의 작업이 모두 완료될 때까지 기다리는 기능을 제공합니다.

var wg sync.WaitGroup

func main() {
    wg.Add(1)
    go worker(&wg)
    wg.Wait() // 모든 고루틴이 종료될 때까지 대기
}

func worker(wg *sync.WaitGroup) {
	defer wg.Done()
    // 작업 수행
}

3. 고루틴과 sync 패키지 함께 활용하기

고루틴과 sync 패키지를 함께 사용하여 데이터를 안전하게 동기화하고 공유할 수 있습니다. 예를 들면 sync.Mutex를 사용하여 공유 데이터에 대한 안전한 접근을 보장하고, sync.WaitGroup을 사용하여 고루틴의 모든 작업이 완료될 때까지 기다릴 수 있습니다.

var mu sync.Mutex
var wg sync.WaitGroup
var sharedData int

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go worker(i)
    }
    wg.Wait() // 모든 고루틴이 종료될 때까지 대기
    fmt.Println(sharedData) // 공유 데이터 출력
}

func worker(id int) {
    defer wg.Done()
    mu.Lock() // 잠금 획득
    sharedData += id // 공유 데이터 조작
    mu.Unlock() // 잠금 해제
}

4. 결론

고루틴과 sync 패키지는 Go 언어에서 동시성을 다루는 데 매우 유용한 기능을 제공합니다. 고루틴을 이용하여 병행성 작업을 처리하고, sync 패키지를 이용하여 데이터를 안전하게 공유하고 동기화할 수 있습니다. 이러한 기능들을 함께 활용하여 안전하고 효율적인 동시성 코드를 작성할 수 있습니다.

참고 자료:

고루틴과 sync 패키지를 함께 사용하는 방법에 대해 알아보았습니다. 동시성 처리에 대한 추가적인 내용을 공부하고자 하는 분들에게 도움이 되기를 바랍니다.