Golang empty select{} vs for{}

00_8_3·2023년 3월 9일
0

Go

목록 보기
7/10

공통

  • 무한루프다.

select {}

  • select는 채널을 기다리는데 empty select는 채널을 블락한다.
  • 스케줄러가 잠자기 모드로 전환 -> cpu 0% 사용
  • 잠자기 모드 전환을 방지하려면 default를 사용하거나 return을 사용하면 된다.
package main

import (
	"log"
)

func main() {
	go func() {
		log.Println("Hello, World!")
	}()

	select {}
}

출력값
Hello, World!
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [select (no cases)]:
main.main()
/mnt/c/Users/user/Desktop/test/main.go:13 +0x2a
exit status 2

for {}

  • 채널과 관련 없다. 채널 관련 데드락 발생하지 않는다.
  • CPU 100%를 사용한다.
package main

import (
	"log"
)

func main() {
	go func() {
		log.Println("Hello, World!")
	}()

	// 프로그램이 종료될 때까지 기다립니다.
	for {}
}

출력값
Hello, World!

결론

둘의 차이를 알아보았다.
하지만 현실에서 비어있는 select나 for문을 사용하지는 않을 듯 하다.

2023-05-10
tendermint의 Node 실행부에서 select {} 사용을 한다.
https://github.com/tendermint/tendermint/blob/main/cmd/tendermint/commands/run_node.go#L130...L131

참고

https://stackoverflow.com/questions/18661602/what-does-an-empty-select-do

https://groups.google.com/g/golang-nuts/c/rtUIY5_m51I

0개의 댓글