괴발개발 성장기

Study/Go 언어

[golang] 채널(channel)에서 주의할 점

지니유 2022. 10. 6. 19:29
반응형

 

2022.10.05 - [Study/Go 언어] - [golang] 채널(channel) 기본 문법

 

[golang] 채널(channel) 기본 문법

# 채널이란? 값을 전달하는 통로이다. 고루틴에서 고루틴으로 서로 값을 주고 받을 때 많이 사용한다. # 채널 생성 방법 ch := make(chan 데이터타입, 사이즈) 예시 ch := make(chan int, 3) int 타입의 채널

pink1016.tistory.com

 

 

# 주의할 점

1) 채널이 꽉 찼을 경우

예를 들어보자

	ch := make(chan int, 3)
	ch <- 1
	ch <- 2
	ch <- 3
	ch <- 4

	fmt.Println("finish")

위에 만든 채널에 1, 2, 3을 넣었다. 그래서 채널이 꽉 찼다. 이 상태에서 4를 넣으면 어떻게 될까?

 

결괏값

fatal error: all goroutines are asleep - deadlock!

채널이 꽉 차서 4는 send를 하기 위해서 계속 대기를 한다.

그래서 finish가 출력되지 않고 프로그램이 비정상적으로 종료된다.

 

 

2) 채널이 비어 있는 경우

예를 들어보자

ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3

<-ch
<-ch 
<-ch
<-ch //채널에 값을 가져올 수 없어서 무한 대기

fmt.Println("finish")

채널에 1, 2, 3을 넣는다. 그리고 채널을 4번 뺀다. 그럼 어떻게 될까?

결과값

fatal error: all goroutines are asleep - deadlock!

 4번째 호출을 했을 때 채널 안에 값이 없어서 가져올 수 없는 상황이다.

그래서 무한 대기를 타다가 비정상적으로 종료가 된다.

 

 

# 참조

https://github.com/YooGenie/go-study/issues/42

 

채널에서 blocking 공부 · Issue #42 · YooGenie/go-study

 

github.com

 

 

반응형