고루틴과 sync 패키지는 Go 언어에서 동시성을 처리하는 데 매우 유용한 도구입니다. 고루틴은 가벼운 스레드처럼 동작하며, 병행성 작업을 처리하는 데 도움이 됩니다. 한편, sync 패키지는 동시성 작업에서의 데이터 공유와 접근을 안전하게 관리하는 데 사용됩니다. 본 블로그에서는 고루틴과 sync 패키지를 함께 사용하여 데이터 동기화와 공유하는 방법에 대해 설명하겠습니다.
목차
1. 고루틴(Goroutine) 소개
고루틴은 Go 언어의 경량 스레드로, 함수를 동시에 실행하여 병행성을 처리하는 데 사용됩니다. 고루틴은 go
키워드를 사용하여 함수를 호출할 때 생성됩니다.
func main() {
go worker() // 고루틴 시작
// ...
}
func worker() {
// 고루틴에서 수행할 작업
}
고루틴을 사용하면 여러 작업을 병렬로 처리할 수 있으며, 채널을 통해 데이터를 안전하게 공유할 수 있습니다.
2. sync 패키지 사용하기
sync 패키지는 고루틴 간의 데이터 공유와 접근을 안전하게 처리하기 위한 기능을 제공합니다. 가장 자주 사용되는 기능으로는 sync.Mutex
와 sync.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 패키지를 이용하여 데이터를 안전하게 공유하고 동기화할 수 있습니다. 이러한 기능들을 함께 활용하여 안전하고 효율적인 동시성 코드를 작성할 수 있습니다.
참고 자료:
- Go 언어 공식 문서: https://golang.org/pkg/sync/
- “Concurrency in Go” by Katherine Cox-Buday: https://www.oreilly.com/library/view/concurrency-in-go/9781491941294/
고루틴과 sync 패키지를 함께 사용하는 방법에 대해 알아보았습니다. 동시성 처리에 대한 추가적인 내용을 공부하고자 하는 분들에게 도움이 되기를 바랍니다.