파이문

Producer-Consumer 종료하기 본문

TIL

Producer-Consumer 종료하기

민Z 2020. 12. 3. 23:19

자바로 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 와 동일하다면, 예상한 것 처럼 동작한 것이라고 보고 짰다.

 

그런데 알고보니 이런 방식이 다른 프로젝트에서도 쓰이고 있었었다. 예전에는 무심코 넘어갔던 부분이 드디어 이해가 되었다.

Comments