[go] 비동기적 데이터 처리를 위한 sync 패키지 활용

본 문서에서는 Go 언어에서 비동기 데이터 처리를 위한 sync 패키지의 활용에 대해 다룹니다.

동시성과 병행성

Go 언어에서 동시성(Concurrency)은 여러 작업을 동시에 실행하는 것을 말하며, 병행성(Parallelism)은 실제로 여러 작업을 동시에 실행하는 것을 의미합니다. sync 패키지는 고루틴(Goroutine) 간의 동기화를 통해 이러한 동시성과 병행성을 제어하는 데 사용됩니다.

sync 패키지의 기능

sync 패키지는 여러 가지 기능을 제공합니다. 그 중에서도 sync.WaitGroup, sync.Mutex, sync.RWMutex 등이 가장 널리 사용되고 있습니다.

sync.WaitGroup

sync.WaitGroup은 고루틴의 작업이 완료될 때까지 대기하는 기능을 제공합니다. 다수의 고루틴이 작업을 완료하고 그 결과를 종합해야 하는 경우에 사용됩니다.

var wg sync.WaitGroup

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go worker(i)
    }
    wg.Wait()
}

func worker(id int) {
    defer wg.Done()
    // Do some work
}

sync.Mutex

sync.Mutex는 여러 고루틴 간에 상호 배제를 위해 사용됩니다. 공유 자원에 대한 접근을 동기화하여 경쟁 조건을 피하고 데이터 무결성을 보호합니다.

var mu sync.Mutex

func main() {
    mu.Lock()
    // Critical section
    mu.Unlock()
}

sync.RWMutex

sync.RWMutex은 읽기와 쓰기 연산을 구분하여 공유 자원에 대한 접근을 동기화하는 데 사용됩니다. 여러 고루틴이 동시에 읽기를 수행하거나, 하나의 고루틴이 쓰기를 수행하고 여러 고루틴이 동시에 읽기를 수행하는 경우에 활용됩니다.

var mu sync.RWMutex

func main() {
    mu.RLock()
    // Read operation
    mu.RUnlock()

    mu.Lock()
    // Write operation
    mu.Unlock()
}

결론

sync 패키지는 고루틴 간의 동기화를 위한 강력한 도구를 제공합니다. 동시성과 병행성을 관리하고 공유 자원에 안전하게 접근하기 위해 sync 패키지를 적절히 활용하는 것이 중요합니다.

이상으로 sync 패키지를 활용한 비동기적 데이터 처리에 대한 소개를 마치겠습니다.

참고 문헌