0Pricing
Lua Academy · 강의

코루틴을 이용한 비동기/대기

코루틴을 양보하고 재개하는 async() 및 await() 도우미를 만듭니다.

코루틴을 이용한 비동기/대기은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

비동기/await 개념

비동기/await는 비동기 작업을 동기 코드처럼 보이게 하는 프로그래밍 모델입니다. Lua에서는 코루틴이 yield/resume 메커니즘을 제공하므로 이를 자연스럽게 구현할 수 있습니다.

await 함수

await(future)는 현재 코루틴을 yield하고, 퓨처가 완료될 때 코루틴을 resume하는 콜백을 저장합니다.

local function await(future)
  local co = coroutine.running()
  future.onComplete = function(result)
    coroutine.resume(co, result)
  end
  return coroutine.yield()
end

비동기 함수 래퍼

async(fn)은 함수가 스케줄러가 관리하는 새 코루틴에서 실행되도록 감쌉니다.

local function async(fn)
  return function(...)
    local co = coroutine.create(fn)
    local ok, err = coroutine.resume(co, ...)
    if not ok then print("async error:", err) end
    return co
  end
end

간단한 퓨처 객체

퓨처는 아직 결과가 나오지 않은 상태를 나타냅니다. 나중에 완료하면 기다리고 있던 모든 코루틴을 resume합니다.

local function newFuture()
  local f = {done=false, value=nil, waiters={}}
  f.complete = function(val)
    f.done = true; f.value = val
    for _, cb in ipairs(f.waiters) do cb(val) end
  end
  f.andThen = function(cb)
    if f.done then cb(f.value)
    else f.waiters[#f.waiters+1] = cb end
  end
  return f
end

실제 await 사용

내부적으로는 yield와 resume을 사용하지만 순차적으로 보이는 비동기 코드를 작성합니다.

local fetchData = async(function(url)
  local result = await(httpGet(url))  -- yields
  local parsed = await(parseJSON(result))  -- yields again
  print("Got:", parsed.name)
end)
fetchData("http://example.com/api")

오류 전파

퓨처를 통해 오류를 전달합니다. 작업이 실패하면 오류 플래그와 오류 메시지를 사용하여 코루틴을 resume합니다.

local function awaitSafe(future)
  local co = coroutine.running()
  future.onComplete = function(ok, result)
    coroutine.resume(co, ok, result)
  end
  return coroutine.yield()
end

순차 실행과 병렬 실행

서로 의존하는 작업에는 await를 순서대로 사용합니다. 독립적인 작업에는 두 코루틴을 생성하고 결합 퓨처를 await합니다.

Promise.all 패턴

여러 비동기 작업을 실행하고 카운터 퓨처를 사용하여 모두 완료될 때까지 기다립니다.

local function all(futures)
  local results = {}
  local count = #futures
  local combined = newFuture()
  for i, f in ipairs(futures) do
    f:andThen(function(v)
      results[i] = v
      count = count - 1
      if count == 0 then combined.complete(results) end
    end)
  end
  return combined
end

취소

코루틴을 resume하기 전에 취소됨으로 표시하여 취소를 구현합니다. 코루틴은 이 플래그를 확인하고 일찍 반환합니다.

입출력과의 통합

비차단 입출력과 통합합니다. 입출력 호출이 차단될 상황이면 yield하고, 데이터를 사용할 수 있을 때 resume하도록 콜백을 등록합니다.

콜백 방식과의 비교

코루틴을 사용하는 비동기/await 방식은 중첩된 콜백보다 훨씬 읽기 쉽습니다. pcall을 사용한 오류 처리도 콜백 오류 매개변수를 사용하는 것보다 깔끔합니다.

비동기/await 질문

코루틴 기반 비동기 시스템에서 await(future)는 무엇을 합니까?

복습: 코루틴을 활용한 비동기/await

비동기 작업을 완료될 때 yield한 코루틴을 resume하는 퓨처로 감싸 코루틴을 사용한 비동기/await를 구현합니다. 그 결과 코드는 순차적으로 보이지만 실제로는 차단되지 않습니다.

자주 묻는 질문

“코루틴을 이용한 비동기/대기” 강의는 무료인가요?

네 — “코루틴을 이용한 비동기/대기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“코루틴을 이용한 비동기/대기”에서 뭘 배우나요?

코루틴을 양보하고 재개하는 async() 및 await() 도우미를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“코루틴을 이용한 비동기/대기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 간단한 이벤트 루프 만들기
  2. 코루틴을 이용한 비동기/대기
  3. 프로미스 유사 패턴
  4. luasocket을 이용한 논블로킹 입출력
← Lua Academy(으)로 돌아가기