<- chan1 이렇게 빈 채널에서 끄집어올때나
아니면 채널이 꽉 찼는데 꽉찬 채널에 chan1 <- someData 이렇게 집어넣을 때
all goroutines are asleep - deadlock 이런에러가 나오는데
위 상황들은 데드락이랑 별로 상관없는거 아님??
그리고 채널 꽉 찼을 때 에러 안내고 채널 공간 비어있을때까지 기다리게 하는법없음?
<- chan1 이렇게 빈 채널에서 끄집어올때나
아니면 채널이 꽉 찼는데 꽉찬 채널에 chan1 <- someData 이렇게 집어넣을 때
all goroutines are asleep - deadlock 이런에러가 나오는데
위 상황들은 데드락이랑 별로 상관없는거 아님??
그리고 채널 꽉 찼을 때 에러 안내고 채널 공간 비어있을때까지 기다리게 하는법없음?
빈 채널에서 값을 받으면 zero value와 false가 나오고 (원래 채널에서 받는 연산자의 return value가 2개임) 꽉 찬 채널에 넣으면 빌 때까지 기다리니 dead lock은 다른 곳에서 생긴 문제임. 채널에 버퍼를 걸지 않거나 select문으로 다 받았을 때 컨텍스트에 Done을 보내서 메세지 캐치하면 됨
채널에 버퍼를 건다는게 무슨말임?
채널이 찼다는 거 자체가 버퍼를 걸었으니 다 찬거죠. 버퍼 사이즈 지정 안하면 계속 들어감
쉽게 말해서 make(chan T, size)는 size라는 고정 크기를 갖는 lock-free 큐를 생성하는 거고, make(chan T)는 크기 지정을 안하는 거임
크기지정안하면 계속들가는게 아니라 하나만 들가지않음?
하나 들갈때마다 빼줘야되는걸로 알고잇는데 크기지정안하면
아뇨 계속 들어감. 하나만 들어가는 건 make(chan T, 1)이지
잘못알고있는 거 같은데... 하나만 들어가는 게 아니라 들어올 때마다 스트림하게 처리를 해줘서 바로바로 빼주는 것처럼 보이는 거임. 여러 고루틴에서 값을 받고 그 중에 조건에 맞는 값들만 어떤 채널에 넣고 그 채널을 리턴하는 함수를 생각해보셈. 채널은 사이즈를 지정하지 않으면 기본적으로 값을 계속 집어넣을 수 있음
그럼 다른질문인데 혹시 함수안에서 채널을 사용하면 그 함수 사용할때 go 붙여서 사용해야함? 이거때매 deadlock 에러 나나싶어서
ㅇㅇ 채널은 기본적으로 고루틴 간 통신을 위한 자료구조이기 때문에 기다릴 고루틴이 없으면 deadlock에 빠짐