Channel message passing

채널 메시지 전달

A sender and receiver exchange values through a channel and may wait for each other.

···
html
<div class="v"><header><b>CHANNEL RENDEZVOUS</b><span id="state"></span></header><main><div class="rendezvous"><div class="endpoint" id="sender">SENDER</div><div class="wire"><div class="packet" id="packet">42</div></div><div class="endpoint" id="receiver">RECEIVER</div></div><div class="status" id="channelstatus"></div></main><footer>unbuffered send meets receive</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} .rendezvous{height:68%;display:flex;align-items:center;justify-content:space-between;gap:4px}.endpoint{width:32%;border:1px solid var(--line);border-radius:6px;padding:10px 3px;text-align:center;font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}.wire{flex:1;border-top:2px solid var(--accent);position:relative;height:20px}.packet{position:absolute;top:-15px;left:0;border:1px solid var(--accent);border-radius:50%;background:var(--surface);width:29px;height:29px;display:grid;place-items:center;color:var(--accent);font:700 12px var(--font-sans, sans-serif);transition:left .35s}.status{text-align:center;color:var(--accent);font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}
js
let n=0;const states=["sender waits","receiver ready","value delivered"];function draw(){document.getElementById("packet").style.left=n===2?"calc(100% - 29px)":"0";document.getElementById("receiver").classList.toggle("active",n>=1);document.getElementById("channelstatus").textContent=states[n];document.getElementById("state").textContent="phase "+(n+1);n=(n+1)%3}draw();setInterval(draw,1050)

A channel carries a value from one job to another. With an unbuffered channel, transfer occurs when sender and receiver meet, so either side may wait for its counterpart.

A buffered channel lets a sender proceed while capacity remains. Sending blocks again when full, so capacity and shutdown behavior need deliberate design.

When to use

Use it to pass values and ownership between jobs instead of mutating shared state directly.

Open as page ↗