채널 메시지 전달

Channel message passing

송신자와 수신자가 채널을 통해 값을 주고받고 필요하면 서로를 기다립니다.

···
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)

채널은 한 작업이 만든 값을 다른 작업에 전달하는 통로입니다. 비버퍼 채널에서는 송신과 수신이 만나는 시점에 값이 전달되므로 준비되지 않은 쪽을 기다립니다.

버퍼가 있는 채널은 빈 칸이 남아 있는 동안 송신자가 먼저 진행할 수 있습니다. 버퍼가 가득 차면 다시 대기하므로 버퍼 크기와 종료 신호를 함께 설계해야 합니다.

언제 쓰나

공유 상태를 직접 바꾸는 대신 작업 사이에 값과 소유권을 넘길 때 씁니다.

페이지로 열기 ↗