Producer-consumer

생산자·소비자

Decouple production and consumption with an intermediate buffer.

···
html
<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>
css
.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}
js
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)

A producer adds items to a buffer and a consumer removes them. The buffer absorbs short differences between their rates.

An unbounded buffer can grow without limit when consumption falls behind. A full buffer should pause producers or signal them to slow down.

When to use

Use it in async pipelines, message queues, and file processing.

Open as page ↗