Golang 고 루 틴 - Go series(13)

Date:     Updated:

Categories:

Tags: ,

image

고루틴

드디어 고루틴 시간이 왔다. 사실 이것만 적고싶었다.
Go에서 관리하는 가상 쓰레드라고 할 수 있다. 키워드는 go. 멋있다.
비 동기적으로 함수루틴을 실행하므로 비동기적 실행에서 사용이 된다.
고루틴은 기본적으로 OS의 쓰레드보다 빠르게 만들려고 했기 때문에 Go 런타임에서 관리한다. 종종 하나의 OS쓰레드에서 여러개의 고루틴이 실행되기도 한다.

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 10; i++ {
        fmt.Println(s, "***", i)
    }
}

func main() {
    // 함수를 동기적으로 실행
    say("Sync")

    // 함수를 비동기적으로 실행
    go say("Async1")
    go say("Async2")
    go say("Async3")

    // 3초 대기
    time.Sleep(time.Second * 3)
}

익명함수로 고루틴

익명함수도 고루틴으로 실행할 수 있다.

package main

import (
    "fmt"
    "sync"
)

func main() {
    // WaitGroup 생성. 2개의 Go루틴을 기다림.
    var wait sync.WaitGroup
    wait.Add(2) // 기다릴 수 2개 설정

    // 익명함수를 사용한 goroutine
    go func() {
        defer wait.Done() //끝나면 .Done() 호출 (defer 사용으로 오류 시 goroutine을 종료할 수 있다.)
        fmt.Println("Hello")
    }()

    // 익명함수에 파라미터 전달
    go func(msg string) {
        defer wait.Done() //끝나면 .Done() 호출 (defer 사용으로 오류 시 goroutine을 종료할 수 있다.)
        fmt.Println(msg)
    }("Hi")

    wait.Wait() //Go루틴 모두 끝날 때까지 대기
}

다중 CPU를 쓰는 법

기본적으로 1개의 CPU를 사용한다. 즉, 여러개의 고루틴이 존재하여도 하나의 CPU를 시분할 하여 사용한다는 것이다. 하지만 아래 방법으로 사용을 한다면 복수개의 CPU를 사용할 수 있다.

package main
import "runtime"
func main(){
    runtime.GOMAXPROCS(2)
}

Leave a comment