Computer Science/etc

Producer-Consumer Pattern이란? (개념 /예제)

JeongKyun 2022. 7. 29.
반응형

서론


이번 글에서는 멀티 스레드 환경에서 자주 사용하는 생산자 소비자 패턴에 대해 알아보려한다. 바로 한번 알아보자.

 


 

 

Producer-Consumer Pattern이란?


생산자 소비자 패턴은 작업 목록을 가운데 두고 작업을 생산해내는 주체와 작업을 처리하는 주체를 분리시키는 설계 방법을 말한다. 이 말이 지금은 당장 와닿지 않을 수 있다. 그러나 멀티 스레드를 구성해야하는 상황이라면 해당 내용은 필히 이해하고 구성하기를 권장한다.

 

이렇게 작업을 '생성'하는 부분과 '처리'하는 부분이 각각 감당할 수 있는 부하를 조절할 수 있다는 장점이 있다. 여기서 Producer는 작업을 새로 만들어 큐에 쌓아두고, Consumer는 (블락킹)큐에 쌓여 있는 작업을 가져다 처리하는 구조이다.

 

Producer는 디스크I/O, 네트워크 작업을 하고

Consumer는 CPU작업을 주로 하는 스레드일 경우 성능을 크게 높을 수 있다는 특징이 있다.

 


 

BlockingQueue는 무엇인가?


Consumer가 감당할 수 있는 것보다 많은 양의 작업을 만들어 내면 큐에는 계속해서 작업이 누적되는데, 결국에는 그 이슈가 메모리 오류를 일으키게 된다. 하지만, 큐의 크기에 제한을 두면 큐에 빈 공간이 생길 때 까지 작업을 추가하지 않고 대기 하도록 구현하여 메모리 오류를 막을 수 있다.

 

또한, 큐에 작업이 없을 경우에는 Consumer가 큐의 작업이 추가 될 때 까지 대기하여, 불 필요한 연산을 하지 않도록 구현한다. 바로 이 역할을 하는 것이 BlockingQueue이다. 

 

BlockingQueue 결국 Producer가 작업을 빨리 처리하거나, Consumer가 작업을 빨리 처리하는 경우의 오류를 피할 수 있도록 도와주고, 작업의 대한 스레드 간의 동기화 작업량을 조절해주어 Thread-Safe하게 프로그램을 만들어 낼 수 있다.

 


 

Put & Take란?


위 참고 이미지에서의 Put()은 큐의 크기에 제한이 되어 있을 경우 큐에 빈 공간이 생길 때 까지 대기하고있따가 빈 공간이 생기면 작업의 큐를 넣어주는 것을 말한다. 

 

Take()는 큐의 작업이 없을 경우, 작업이 생길 대 까지 대기하고 작업이 생기면 큐에서 작업을 가져가는 것을 말한다. 

 

 

 

 

댓글

💲 많이 본 글