스위프트 호출자 격리 비동기 함수

Swift nonsending async

호출자 액터에서 이어서 실행하거나 @concurrent로 별도 실행기에 넘깁니다.

···
html
<div class="v"><header><b>ASYNC EXECUTOR CHOICE</b><span id="state"></span></header><main><div class="choice"><div class="row" id="actorrow"><b>CALLER ACTOR</b><span id="actorjob">await → work</span></div><div class="row" id="poolrow"><b>POOL</b><span id="pooljob">idle</span></div></div></main><footer>execution context is an explicit choice</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} .choice{height:100%;display:flex;flex-direction:column;justify-content:center;gap:8px}.row{height:36%;box-sizing:border-box;border:1px solid var(--line);border-radius:7px;padding:7px;display:flex;align-items:center;justify-content:space-between;gap:5px;font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}.row span{border:1px solid var(--line);border-radius:5px;padding:5px}.row.on{border-color:var(--accent)}.row.on span{background:var(--accent);color:var(--bg)}
js
let n=0;function draw(){document.getElementById("actorrow").classList.toggle("on",!n);document.getElementById("poolrow").classList.toggle("on",!!n);document.getElementById("actorjob").textContent=n?"caller free":"await → work";document.getElementById("pooljob").textContent=n?"@concurrent work":"idle";document.getElementById("state").textContent=n?"explicit hop":"nonsending";n=1-n}draw();setInterval(draw,1350)

Swift 6.2의 nonisolated(nonsending) async 함수는 호출자의 액터 실행 문맥을 상속할 수 있습니다. 액터 밖으로 불필요하게 이동하지 않아도 그 문맥에 격리된 값을 안전하게 다룰 수 있습니다.

CPU 작업까지 같은 액터에서 수행하면 UI 응답이 밀릴 수 있습니다. 병렬 실행이 필요한 함수에는 @concurrent를 명시해 다른 실행기로 넘깁니다. 기본 동작은 프로젝트의 언어 설정과 채택한 기능에 따라 확인해야 합니다.

언제 쓰나

비동기 함수를 호출자 격리에 남길지 병렬 실행기로 보낼지 정할 때 씁니다.

페이지로 열기 ↗