[go] sync 패키지를 이용한 동시성 기반 서버
본 포스트에서는 Go 언어의 sync
패키지를 활용하여 동시성 기반의 서버를 구축하는 방법을 소개합니다.
소개
Go는 강력한 동시성을 제공하는 언어로, 병행성(concurrency)과 병렬성(parallelism)을 쉽게 다룰 수 있습니다. sync
패키지는 이러한 동시성을 다루기 위한 여러 도구와 기능을 제공합니다.
WaitGroup을 이용한 동시성 제어
sync
패키지의 WaitGroup
은 고루틴들이 모두 실행을 마칠 때까지 대기할 수 있는 도구로, 동시성 작업의 완료를 기다리거나 여러 고루틴의 실행을 동기화할 때 유용합니다.
아래는 기본적인 WaitGroup
을 이용한 동시성 제어 예시입니다.
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// 작업 1 수행
fmt.Println("작업 1 완료")
}()
go func() {
defer wg.Done()
// 작업 2 수행
fmt.Println("작업 2 완료")
}()
wg.Wait()
fmt.Println("모든 작업 완료")
}
Mutex를 이용한 공유 자원 보호
동시에 여러 고루틴이 접근하는 공유 자원을 보호하기 위해 sync
패키지의 Mutex
를 사용할 수 있습니다. 아래는 Mutex
를 사용한 간단한 예시입니다.
package main
import (
"fmt"
"sync"
)
type Counter struct {
mu sync.Mutex
value int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
func (c *Counter) GetValue() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.value
}
func main() {
c := Counter{}
for i := 0; i < 10; i++ {
go c.Increment()
}
fmt.Println("최종 값:", c.GetValue())
}
결론
sync
패키지를 이용하면 고루틴 간의 동기화 및 공유 자원 보호를 효율적으로 관리할 수 있습니다. 이를 통해 안전하고 효율적인 동시성 기반 서버를 구축할 수 있습니다.
더 자세한 내용은 공식 Go 문서를 참고하세요.