[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 문서를 참고하세요.