백엔드 공부/Golang

채널(channel), 컨텍스트(Context)

철매존 2023. 8. 28. 23:07
728x90

채널(channel), 컨텍스트(Context)

이전에 고루틴을 나누는 방법을 보았는데, 동시성을 제어하는 방법들을 살펴봤다.
그리고 거기서 역할을 나누는 것이 있었고... 이 때에 쓰이는게 채널이다.

채널 : 고루틴끼리 메세지를 전달할 수 있는 메세지 큐

데이터를 FIFO로 넣고 -> 빼고 이렇게 하는거임

이거 다른말로 Thread-safe Queue이다.

채널의 크기

기본 크기 0

처음 만들면 크기가 0으로 생성된다.
그리고 make(chan int, 20) 이런 식으로 크기를 정해줄 수 있다(이러면 20개짜리 크기)

이거 그래서 채널 만들어놓고 데이터 넣은 다음에 안빼주면 무한히 대기하게 된다ㄷㄷ
이런것을 좀비 고루틴, 록은 고루틴 릭이라고 하는데(채널을 닫아주지 않아 무한 대기를 하는 고루틴) 이거는 close()로 닫아줄 수 있다. -> 지금 있는거를 다 쓰면 대기하지 않고 걍 닫는거다.

이거를 무한대기 할지 안할지를 잘 확인해야 한다..

select

여러 채널에서 동시에 데이터를 기다릴 때 사용한다.
참고로 Select는 걍 저 case중에 하나만 해결되면 알아서 나간다. 그래서 대기할라면 for문같은거 써줘야한다.

그래서 이게 역할을 나눠서 처리하는거랑 무슨 상관인데??

채널을 통한 생산자(producer) / 소비자(consumer) 패턴을 구현하는 것이다.

예를 들어 자동차를 만든다!! 라고 했을때에 공간을 나누는 경우에는 걍 공장을 여러개 만들어서 거기서 자동차를 만들게 하는 것이다.

그리고 여기서 하는 역할을 나누는 경우는

차체 생산 -> 바퀴 설치 -> 도색 등등으로 역할을 나눠서 일을 시키는거다.
그리고 여기서 화살표로 가는게 채널을 쓰는거다.

즉 이전 역할을 한 애가 채널에 넣어주고(생산자) 이거를 받아와서 다음 역할을 진행하는애가 쓰고(소비자) ... 요렇게 하는거다!!

컨텍스트(Context)

작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서 역할을 한다.

그러니까 고루틴을 만들어서 역할별로 진행할 때에 조건을 추가해줄 수 있는 녀석이다.

예를 들어 위에서 바퀴설치 를 진행할 때에 넥센 타이어를 달도록 하는.. 등이라는 느낌이다.

채널로 발행/구독 패턴 구현

발행(publisher)/구독(subscriber) 패턴 구현
옵져버 패턴과 거의 유사하다.(같다고 봐도 무방하다.)

사실 옵져버 패턴은 동기식인데, 이거의 redisson을 생각하면 될 것 같다.