일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- OOM
- 코드워
- 프로그래머스
- Linux
- docker
- scala
- 동적프로그래밍
- dynamic programming
- Python
- redis
- 리눅스
- leetcode
- codewars
- golang
- 알고리즘
- zookeeper
- HBase
- 파이썬
- gradle
- programmers
- boj
- 튜토리얼
- 문제풀이
- 주키퍼
- 스칼라
- Go언어
- Java
- 자바
- go
- DP
- Today
- Total
파이문
Producer-Consumer 종료하기 본문
자바로 Producer-Consumer 개발을 진행하고 있었다.
Producer 에서 더 이상 Queue 에 집어 넣을 데이터가 없는 경우 POISON 이라고 명명한 임의의 객체를 Queue 에 넣게 하였고, Consumer 에서 Queue 에서 꺼낸 데이터가 POISON 일 경우 종료 되게 만들었다.
(Producer-Consumer 의 run 은 while loop 로 돌아가고 있었다.)
single producer, single consumer 일 때는 잘 동작하였다.
그러나 producer 개수가 consumer 보다 적은 경우는 예상대로 종료 되지 않았다.
당연하겠지만 producer 개수 만큼 queue 에 POISON 이 들어갔기 때문에, 나머지 consumer 들은 해당 (producer) 개수 만큼만 종료 되고 나머지 consumer 들은 block 되어 대기 하고 있었기 때문이다.
그래서 consumer 가 queue 에서 POISON 을 꺼내면 다시 queue 에 넣어버리고 종료 하게 하였다. (CountDownLatch 로 삽질한 건 비밀)
이러면 마치 마라톤 바톤 터치 (같네요 라고 셀원이 얘기를 해 줌) 처럼 동작하게 된다.
consumer 는 다음 consumer 의 종료를 위해 POISON 을 넘기는 것이다. (이 때 queue 에서 꺼낸 데이터가 producer 에서 온 건지, 다른 consumer 에서 온건지는 구분하지 않았다. 별로 중요하진 않아서)
이럴 경우 모든 consumer 는 POISON 을 queue 에서 꺼내서 종료할 수 있는게 보장 된다.
테스트 코드는 모든 프로세스/스레드가 종료 되고 나면, queue size 가 producer count 와 동일하다면, 예상한 것 처럼 동작한 것이라고 보고 짰다.
그런데 알고보니 이런 방식이 다른 프로젝트에서도 쓰이고 있었었다. 예전에는 무심코 넘어갔던 부분이 드디어 이해가 되었다.
'TIL' 카테고리의 다른 글
curl 요청 및 응답 시간 자세히 보기 (0) | 2020.12.10 |
---|---|
TimedSemaphore 를 사용하던 멀티 쓰레드가 종료 안되던 문제 (0) | 2020.12.08 |
[Hadoop] TableReducer 로 테이블 여러개 사용하기 (0) | 2020.11.20 |
셸 업그레이드 후 zsh 가 안되는 문제 (0) | 2020.11.06 |
Java ShutdownHook With Signal (0) | 2020.10.29 |