golang
Go: 함수가 리턴해도 함수 속 고루틴은 종료되지 않는다
주먹불끈
2023. 10. 10. 02:08
개요
Go를 사랑한다고 말하고 다녀놓고서는 이걸 확실히 해두지 못했었다.
결론부터 말하면
- main 함수(역시 고루틴이다)이 종료하면 모든 고루틴은 종료한다.
- 하지만, 그 외의 함수는 리턴을 하더라도 함수 내에서 실행한 고루틴은 종료하지 않는다.
main 함수가 종료하면 고루틴도 종료된다
예제 1. 고루틴 중간 종료
코드 링크: https://goplay.tools/snippet/78mv5TTsJMd
고루틴은 1초를 기다렸다 출력을 하는 코드인데, 그 전에 main 함수가 종료해버리기에 고루틴도 종료가 되어버려 출력을 하지 못한다.
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main start")
go func() {
time.Sleep(1 * time.Second)
fmt.Println("go routine")
}()
fmt.Println("main end")
return
}
// Output:
// main start
// main end
가장 간단한 (하지만 바람직하지 못한) 해법으로 고루틴이 동작할 동안 main 함수가 기다렸다 종료하면, 고루틴이 제대로 실행되는 것을 볼 수 있다.
코드 링크: https://goplay.tools/snippet/UJD2A0V4p9P
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main start")
go func() {
time.Sleep(1 * time.Second)
fmt.Println("go routine")
}()
fmt.Println("main end")
**time.Sleep(2 * time.Second) // 고루틴을 기다려준다.**
return
}
// Output:
// main start
// main end
// go routine
예제 2. 함수가 종료해도 함수 내 고루틴은 종료하지 않는다
main 함수외의 함수는 리턴을 하더라도 함수 내에서 실행한 고루틴은 종료하지 않는다.
코드 링크: https://goplay.tools/snippet/QBPpEyUM0L5
myGo 함수가 이미 리턴을 했음에도 함수 내부에서 실행한 고루틴은 종료하지 않고 실행된다.
package main
import (
"fmt"
"time"
)
func myGo() {
go func() {
time.Sleep(1 * time.Second)
fmt.Println("go routine")
}()
fmt.Println("myGo function returns")
return
}
func main() {
fmt.Println("main start")
myGo()
time.Sleep(2 * time.Second)
fmt.Println("main end")
return
}
// Output:
// main start
// myGo function returns
// go routine
// main end
반응형