[go] sync 패키지를 이용한 동시성 디자인 패턴
Go 언어의 동시성 처리는 sync
패키지를 이용하여 쉽게 구현할 수 있습니다. 이번 포스트에서는 sync
패키지를 사용하여 가장 일반적으로 사용되는 세 가지 동시성 디자인 패턴에 대해 알아보겠습니다.
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/ 를 참고하여 작성되었습니다.