고루틴과 sync 패키지를 사용하면 Go 언어로 효율적이고 안전한 병렬 프로그래밍을 할 수 있습니다. 이번 포스트에서는 고루틴과 sync 패키지를 사용하여 웹 서버를 구현하는 방법에 대해 알아보겠습니다.
목차
고루틴이란
고루틴은 Go 언어의 경량 스레드로, 병렬로 실행될 수 있는 코드 블록을 나타냅니다. go
키워드를 사용하여 함수 앞에 붙이면 해당 함수가 고루틴으로 실행됩니다. 고루틴은 스레드보다 경량이며, 수백, 수천 개의 고루틴을 생성해도 성능에 부하를 주지 않습니다.
go func() {
// 고루틴으로 실행될 코드
}()
sync 패키지
sync 패키지는 고루틴 간에 안전하게 데이터를 공유하고 동기화하는 데 사용됩니다. sync 패키지에는 뮤텍스, 웨이트 그룹, 어토믹 연산 등을 지원하는 여러 도구가 포함되어 있습니다. 이를 사용하여 고루틴 간의 경쟁 상태와 데드락을 해결할 수 있습니다.
웹 서버 구현
이제 고루틴과 sync 패키지를 사용하여 간단한 웹 서버를 구현해보겠습니다. 코드는 아래와 같습니다.
package main
import (
"fmt"
"net/http"
"sync"
)
var mu sync.Mutex
var count int
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/count", counter)
http.ListenAndServe("localhost:8000", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
mu.Lock()
count++
mu.Unlock()
fmt.Fprintf(w, "Hello, 웹!")
}
func counter(w http.ResponseWriter, r *http.Request) {
mu.Lock()
fmt.Fprintf(w, "방문자 수: %d", count)
mu.Unlock()
}
위 코드는 http
패키지를 사용하여 “/” 경로와 “/count” 경로에 대한 핸들러를 등록하고, 고루틴을 이용하여 각 핸들러를 병렬로 실행합니다. 또한, 뮤텍스를 사용하여 count 변수를 안전하게 공유하고 동기화합니다.
이제 코드를 실행하고 웹 브라우저에서 “localhost:8000”으로 접속하면 “Hello, 웹!”이 표시되고, “/count”로 접속하면 방문자 수가 표시됩니다.
고루틴과 sync 패키지를 사용하여 병렬 웹 서버를 구현하는 방법에 대해 간단히 소개했습니다. 이를 응용하여 더 복잡한 웹 애플리케이션을 개발할 수 있습니다.
참고문헌:
- https://gobyexample.com/goroutines
- https://golang.org/pkg/sync/