Go by Example: [22] GoRoutines

Goroutines

goroutine은 경량적인 실행 스레드이며, Go언어차원에서 지원하는 병렬실행 기능입니다.

package main

import "fmt"

func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}

func main() {

    f("direct")                     // [1]
    
    go f("goroutine")               // [2]
    
    go func(msg string) {           // [3]
        fmt.Println(msg)
    }("going")
    
    var input string
    fmt.Scanln(&input)              // [4]
    fmt.Println("done")
}
  1. f(s)함수를 일반적으로 호출하고 있습니다. 동기적으로 작동하는지를 보기위해서 호출한 것입니다.
  2. goroutinego키워드를 사용하여 호출했습니다. 고루틴은 병렬적으로 실행됩니다.
  3. 익명함수를 생성한 후, 고루틴으로 실행할 수도 있습니다.
  4. 현재 2개의 함수는 고루틴에 의해서 비동기적으로 호출되고 있습니다. main()함수 또한 고루틴입니다.
    호출 및 실행순서를 보기위해서 main()함수 고루틴을 fmt.Scanln()함수를 사용하여, 사용자로 부터
    입력을 대기하게 한 것입니다. 이 부분이 없다면 실행하자말자 종료해버립니다.

실행하면 다음과 같습니다.

$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
<enter>
done

프로그램이 실행되면서 처음 일반적인 f(direct)함수가 실행된 뒤에, 고루틴이 동시에 실행됨을
알 수 있습니다. 하지만 순서는 일관되지 않습니다. 이런 동시실행기능은 시스템 리소스를 적게 먹으면서도,
Go언어 엔진차원에서 기본적으로 제공하는 기능중 하나입니다. (경량쓰레드와 유사합니다.)

다음으로는 프로그램에서 고루틴이 가장많이 사용되는 채널(channels)에 대해서 알아보겠습니다.