생산자는 항목을 버퍼에 넣고 소비자는 버퍼에서 꺼냅니다. 두 쪽의 속도가 잠시 달라도 버퍼가 차이를 흡수합니다.
버퍼에 상한이 없다면 소비가 느릴 때 메모리가 계속 늘어납니다. 가득 차면 생산을 기다리게 하거나 신호를 돌려주는 식으로 용량을 제어해야 합니다.
언제 쓰나
비동기 파이프라인, 메시지 큐, 파일 처리 흐름에 씁니다.
생산과 소비를 사이 버퍼로 분리해 서로 다른 속도를 흡수합니다.
<div class="v"><header><b>PRODUCER / CONSUMER</b><span id="state"></span></header><main><div class="flow"><b>IN</b><div class="buffer" id="buffer"></div><b>OUT</b></div><div class="level" id="level"></div></main><footer>bounded buffer absorbs bursts</footer></div>.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .flow{height:65%;display:flex;align-items:center;justify-content:space-around;gap:5px}.flow>b{font:700 .85em ui-monospace,monospace}.buffer{width:58%;height:52px;border:1px solid var(--line);border-radius:6px;display:flex;align-items:center;gap:4px;padding:4px}.buffer i{flex:1;height:30px;background:var(--accent);border-radius:3px}.level{text-align:center;color:var(--accent);font:600 .85em ui-monospace,monospace}let n=0;const amounts=[1,2,3,2,1,0];function draw(){document.getElementById("buffer").innerHTML=Array.from({length:amounts[n]},()=>"<i></i>").join("");document.getElementById("level").textContent="buffer: "+amounts[n]+" / 3";document.getElementById("state").textContent=n<3?"produce":"consume";n=(n+1)%amounts.length}draw();setInterval(draw,850)생산자는 항목을 버퍼에 넣고 소비자는 버퍼에서 꺼냅니다. 두 쪽의 속도가 잠시 달라도 버퍼가 차이를 흡수합니다.
버퍼에 상한이 없다면 소비가 느릴 때 메모리가 계속 늘어납니다. 가득 차면 생산을 기다리게 하거나 신호를 돌려주는 식으로 용량을 제어해야 합니다.
비동기 파이프라인, 메시지 큐, 파일 처리 흐름에 씁니다.