Go 고루틴(Goroutine)

고루틴(Goroutine)

고루틴(goroutine)은 Go 언어에서의 병행 처리를 실현하는 것으로, thread보다 고속으로 병행 처리를 실행할 수 있다.

아래의 예에서는 메인의 처리를 실행하면서, 병행해 funcA() 고루틴을 go에 의해 실행하고 있다.

package main

import (
	"fmt"
	"time"
)

func funcA() {
	for i := 0; i < 10; i++ {
		fmt.Print("A")
		time.Sleep(10 * time.Millisecond)
	}
}

func main() {
	go funcA()
	for i := 0; i < 10; i++ {
		fmt.Print("M")
		time.Sleep(20 * time.Millisecond)
	}
}

실행 결과:

MAAMAAAMAAMAAMAMMMMM

아래 예제는 채널을 사용하여 goroutine 종료를 기다리는 예이다. chan은 채널을 생성합니다. <-는 채널로 메시지를 주고받는다.

package main

import (
	"fmt"
	"time"
)

func funcA(chA chan<- string) {
	time.Sleep(3 * time.Second)
	chA <- "Finished" // 채널에 메시지 보내기
}

func main() {
	chA := make(chan string) // 채널 생성한다.
	defer close(chA)         // 사용 후에는 닫는다.
	go funcA(chA)            // 채녈 고루틴을 반환한다.
	msg := <-chA             // 채널로부터 메세지를 수신한다.
	fmt.Println(msg)
}

실행 결과:

Finished

다음 예제에서는 select를 사용하여 고루틴 funcA()funcB()둘 다 대기합니다.

package main

import (
	"fmt"
	"time"
)

func funcA(chA chan<- string) {
	time.Sleep(1 * time.Second)
	chA <- "funcA Finished"
}

func funcB(chB chan<- string) {
	time.Sleep(2 * time.Second)
	chB <- "funcB Finished"
}

func main() {
	chA := make(chan string)
	chB := make(chan string)
	defer close(chA)
	defer close(chB)
	finflagA := false
	finflagB := false
	go funcA(chA)
	go funcB(chB)
	for {
		select {
		case msg := <-chA:
			finflagA = true
			fmt.Println(msg)
		case msg := <-chB:
			finflagB = true
			fmt.Println(msg)
		}
		if finflagA && finflagB {
			break
		}
	}
}

실행 결과:

funcA Finished
funcB Finished



최종 수정 : 2023-03-26