Golang 고 루 틴 - Go series(13)
Categories: Golang
고루틴
드디어 고루틴 시간이 왔다. 사실 이것만 적고싶었다.
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