-
golang: 고루틴(Goroutines)이란?Back-End/Golang 2024. 3. 30. 12:02반응형
고루틴(Goroutines)은 Go 언어에서 동시성(concurrency)을 구현하는 핵심적인 부분입니다. 간단히 말하자면, 고루틴은 Go에서 실행되는 경량 스레드(lightweight threads)와 유사합니다. 하지만 전통적인 스레드에 비해 훨씬 적은 메모리를 사용하며, 쉽게 수천 개 이상을 생성하고 관리할 수 있습니다. 고루틴은 Go 런타임에 의해 관리되며, 고루틴 사이의 통신은 주로 채널(Channels)을 통해 이루어집니다.
고루틴의 특징:
- 경량: 고루틴은 매우 작은 메모리 스택을 사용하여 시작되며, 필요에 따라 동적으로 확장됩니다.
- 비동기 실행: 고루틴은 비동기적으로 실행됩니다. 즉, 메인 프로그램의 실행을 차단하지 않고 동시에 실행될 수 있습니다.
- 쉬운 생성: go 키워드를 사용하여 함수 또는 메서드 앞에 간단하게 고루틴을 생성할 수 있습니다.
- 채널을 통한 통신: 고루틴은 채널을 통해 서로 안전하게 데이터를 주고받을 수 있습니다. 채널은 고루틴 사이에서 데이터를 동기화하는 데 사용됩니다.
코드 예시:
아래의 예제는 고루틴과 채널을 사용하여 간단한 데이터 처리를 동시에 수행하는 방법을 보여줍니다. 이 예제에서는 두 개의 고루틴이 생성되어, 한 고루틴은 숫자를 생성하고 다른 고루틴은 그 숫자를 수신하여 출력합니다.
package main import ( "fmt" "time" ) // 숫자를 생성하는 고루틴 func generateNumbers(ch chan int) { for i := 0; i < 5; i++ { // 채널에 숫자를 보냄 ch <- i time.Sleep(time.Second) // 1초 대기 } close(ch) // 사용이 끝난 채널을 닫음 } // 채널에서 숫자를 받아 출력하는 고루틴 func printNumbers(ch chan int) { for num := range ch { // 채널이 닫힐 때까지 계속 수신 fmt.Println("Received:", num) } } func main() { ch := make(chan int) // int 타입을 전송할 수 있는 채널 생성 go generateNumbers(ch) // 숫자 생성 고루틴 시작 go printNumbers(ch) // 출력 고루틴 시작 // 메인 고루틴이 너무 빨리 종료되지 않도록 대기 time.Sleep(6 * time.Second) }
설명:
- generateNumbers 고루틴은 0부터 4까지의 숫자를 하나씩 생성하여 채널에 전송합니다. 각 숫자를 보낸 후 1초를 기다립니다.
- printNumbers 고루틴은 채널에서 숫자를 받아서 출력합니다. 이 고루틴은 채널이 닫힐 때까지 실행됩니다.
- main 함수에서는 두 고루틴을 시작하고, 메인 고루틴이 너무 빨리 종료되지 않도록 6초 동안 대기합니다.
고루틴과 채널을 사용하면 복잡한 동시성 문제를 간결하고 이해하기 쉬운 코드로 해결할 수 있습니다. Go의 이러한 기능은 대규모 시스템에서 효율적인 동시성 관리를 가능하게 합니다.
반응형'Back-End > Golang' 카테고리의 다른 글
golang: for-select 패턴 (0) 2024.04.19 golang: 동시성에서 제한(Confinement)이란? (0) 2024.04.19 golang: 포인터(Pointer)란? (0) 2024.03.30 golang: 컨텍스트(Context)란? (0) 2024.03.30 golang: 채널(Channel)이란? (0) 2024.03.30