ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.