티스토리 뷰

Bing Image Creator에서 "go programming language: goroution" 으로 생성

개요

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
반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
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
글 보관함