티스토리 뷰

Language/Go

Go. Goroutines 고루틴

out of coding 2019. 8. 14. 18:08

고루틴은 Go의 런타임에 의해 관리되는 경량 쓰레드를 의미합니다.

비동기적으로 여러개의 함수를 실행할 수 있게 됩니다.

 

사용 방법은 아주 간단합니다.

func 앞에 go를 붙여 줍니다... 고...

func test(number int) {
}

func main() {
    // 이름있는 함수의 경우
    go test(2)
 
    // 무명함수의 경우
    go func(n int) {
    	for i := 0; i < n; i++ {
        	fmt.Println("number", i)
        }
    }(3)
}

정말 아무짓도 안하는데 손쉽게 동작합니다.

 

하지만 main function이랑은 독립적으로 실행되지만 main function이 종료되면 모든 고루틴이 종료됩니다.

그래서 고루틴보다 main이 먼저 실행에서 종료되는 문제를 방지하기 위해서 sync 라이브러리에 있는 WaitGroup 이라는 세마포어를 활용해 고루틴의 종료를 대기 시켜주어야 합니다.

package main

import(
    "fmt"
    "sync"
)

func main() {
    var wait sync.WaitGroup
    wait.Add(2) // 2개 할당
    
    go func() {
        defer wait.Done() // 끝나면 호출
        fmt.Println("test1")
    }
    
    go func() {
        defer wait.Done() // 끝나면 호출
        fmt.Println("test2")
    }
    
    wait.Wait() // 고루틴이 끝나기 전까지 기다리기
}

저기에 넣은 2라는 숫자가 Done을 호출하면서 숫자가 하나씩 감소하게 되고 0이 되면 모든 작업을 종료합니다.

retain count 같은.... 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함