Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Code Habit

Go ) 고루틴 본문

카테고리 없음

Go ) 고루틴

코드베어 2020. 6. 9. 08:06

고루틴은 함수를 동시에 실행시키는 기능이다. 스레드보다 문법이 간단하고 리소스를 적게 사용한다.

 

사용 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func hello(n int) {
    r := rand.Intn(100)            // 랜덤한 숫자 생성
    time.Sleep(time.Duration(r))// 랜덤한 시간 동안 대기
    fmt.Println(n)
}
 
func main() {
    for i:=0; i<100; i++ {
        go hello(i)        // 고루틴으로 hello 함수 호출
    }
 
    fmt.Scanln() // main 함수가 종료되지 않도록 대기
}

 

실행 결과

12
57
56
95
49
97
...

 

고루틴을 종료하려면 함수 안에서 return으로 빠져나오거나 runtime.Goexit 함수를 사용하면 된다. 단, 리턴값은 사용할 수 없다. 

 

Go 언어는 CPU 코어를 한 개만 사용하도록 설정되어 있다. 다음은 시스템의 모든 CPU코어를 사용하는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
 
import (
    "fmt"
    "runtime"
)
 
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU()) // CPU 개수를 구한 뒤 사용할 최대 CPU 개수 설정
    
    fmt.Println(runtime.GOMAXPROCS(0)) // 설정 값 출력
 
    s := "Hello, world!"    
 
    for i := 0; i < 100; i++ {
        go func(n int) {    // 익명 함수를 고루틴으로 실행
            fmt.Println(s, n)
        }(i)
    }
 
    fmt.Scanln() // main 함수가 종료되지 않도록 대기
}

 

실행 결과

CPU 코어 개수 :  8
Hello, world! 4
Hello, world! 0
Hello, world! 1
Hello, world! 2
...

 

runtime.NumCPU 함수로 현재 시스템의 CPU 코어 개수를 구한 뒤 runtime.GOMAXPROCS 함수에 설정해 준다. 이렇게 하면 모든 CPU코어에서 고루틴을 실행 할 수 있다. runtime.GOMAXPROCS 함수에 0을 넣으면 설정 값은 바꾸지 않으며 현재 설정 값만 리턴한다.