Go 언어 GoLoutine 대하여 배워보기
오늘은 Go 언어의 고루틴에 대하여 작성하면서 배워보려 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import (
"time"
"fmt"
)
func helloworld(){
fmt.Println("hello, world!")
}
func main() {
go helloworld()
time.Sleep(1 * time.Second)
fmt.Println("hello?")
}
메인 함수에서 go 키워드로 함수를 호출하면 런타임에서 고루틴을 실행시킵니다.
논리적 쓰레드로서 비동기적으로 함수를 실행하며, 여러 코드를 동시에 실행시킵니다.
메인 함수가 끝나면 고루틴으로 실행된 함수가 출력을 하기도 전에 종료되므로, 강제로 기다려줘야 합니다.
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
package main
import (
"time"
"fmt"
)
func say1() {
for i := 0; i < 10; i++ {
fmt.Println("hello!")
time.Sleep(1 * time.Millisecond)
}
}
func say2() {
for i := 0; i < 10; i++ {
fmt.Println("go?")
time.Sleep(1* time.Millisecond)
}
}
func main() {
go say1()
go say2()
time.Sleep(100 * time.Millisecond)
}
여러 함수를 고루틴으로 실행하면 기존처럼 순서대로 나오지 않고, 랜덤으로 서로 섞여서 나옵니다.
이 역시 sleep으로 메인에서 기다려줘야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import (
"time"
"fmt"
)
func main() {
go func() {
for i := 0; i < 10; i++ {
fmt.Println("hello! go function!")
time.Sleep(1 * time.Millisecond)
}
}()
time.Sleep(10 * time.Millisecond)
}
익명함수로 고루틴을 실행할 수 있습니다.
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
package main
import (
"sync"
"time"
"fmt"
)
func main() {
var w sync.WaitGroup
w.Add(2)
go func() {
defer w.Done()
for i := 0; i < 2; i++ {
fmt.Println("hello!")
}
}()
go func() {
defer w.Done()
for i := 0; i < 2; i++ {
fmt.Println("go function!")
}
}()
w.Wait()
}
언제까지나 sleep 시킬 수는 없기 때문에, WaitGroup를 만들어서 2개의 고루틴 함수를 기다려주게 할 수 있습니다.
각 고루틴 함수에서 Done을 실행시키게 합니다.
defer 키워드는 타 언어의 finally 처럼 함수가 리턴되기 전에 실행되게 할 수 있습니다.
마지막으로 메인함수에서 wait 로 메인 함수의 마지막까지 코드가 실행되도 종료되지 않도록 해줍니다.
This post is licensed under CC BY 4.0 by the author.