채널(channel), 컨텍스트(Context)
이전에 고루틴을 나누는 방법을 보았는데, 동시성을 제어하는 방법들을 살펴봤다.
그리고 거기서 역할을 나누는 것이 있었고... 이 때에 쓰이는게 채널이다.
채널 : 고루틴끼리 메세지를 전달할 수 있는 메세지 큐
데이터를 FIFO로 넣고 -> 빼고 이렇게 하는거임
이거 다른말로 Thread-safe Queue이다.
채널의 크기
기본 크기 0
처음 만들면 크기가 0으로 생성된다.
그리고 make(chan int, 20)
이런 식으로 크기를 정해줄 수 있다(이러면 20개짜리 크기)
이거 그래서 채널 만들어놓고 데이터 넣은 다음에 안빼주면 무한히 대기하게 된다ㄷㄷ
이런것을 좀비 고루틴, 록은 고루틴 릭이라고 하는데(채널을 닫아주지 않아 무한 대기를 하는 고루틴) 이거는 close()
로 닫아줄 수 있다. -> 지금 있는거를 다 쓰면 대기하지 않고 걍 닫는거다.
이거를 무한대기 할지 안할지를 잘 확인해야 한다..
select
여러 채널에서 동시에 데이터를 기다릴 때 사용한다.
참고로 Select는 걍 저 case중에 하나만 해결되면 알아서 나간다. 그래서 대기할라면 for문같은거 써줘야한다.
그래서 이게 역할을 나눠서 처리하는거랑 무슨 상관인데??
채널을 통한 생산자(producer) / 소비자(consumer) 패턴을 구현하는 것이다.
예를 들어 자동차를 만든다!! 라고 했을때에 공간을 나누는 경우에는 걍 공장을 여러개 만들어서 거기서 자동차를 만들게 하는 것이다.
그리고 여기서 하는 역할을 나누는 경우는
차체 생산
-> 바퀴 설치
-> 도색
등등으로 역할을 나눠서 일을 시키는거다.
그리고 여기서 화살표로 가는게 채널을 쓰는거다.
즉 이전 역할을 한 애가 채널에 넣어주고(생산자) 이거를 받아와서 다음 역할을 진행하는애가 쓰고(소비자) ... 요렇게 하는거다!!
컨텍스트(Context)
작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서 역할을 한다.
그러니까 고루틴을 만들어서 역할별로 진행할 때에 조건을 추가해줄 수 있는 녀석이다.
예를 들어 위에서 바퀴설치 를 진행할 때에 넥센 타이어를 달도록 하는.. 등이라는 느낌이다.
채널로 발행/구독 패턴 구현
발행(publisher)/구독(subscriber) 패턴 구현
옵져버 패턴과 거의 유사하다.(같다고 봐도 무방하다.)
사실 옵져버 패턴은 동기식인데, 이거의 redisson을 생각하면 될 것 같다.
'백엔드 공부 > Golang' 카테고리의 다른 글
Go와 Gin Framework 를 사용한 게시판 만들기 (2) - Swagger 붙이기 (0) | 2022.10.23 |
---|---|
Go와 Gin Framework 를 사용한 게시판 만들기 (1) - 시작하기 (0) | 2022.10.19 |