task로 편리하게 coroutine 제어하기
개요
task는 비동기 작업을 위해 스레드의 스케줄링을 다룰 수 있도록 기능을 제공하는 라이브러리 입니다.
사용 방법
task.wait(delay)
delay초 만큼 스레드를 일시정지할 수 있습니다. n초가 지난 후에는 현재 스레드가 다시 재개됩니다. 실행된 뒤에는 실제 일시정지된 시간을 반환합니다.
task.spawn(functionOrCoroutine, ...)
functionOrCoroutine에 대한 코루틴을 생성하고 즉시 재개합니다. functionOrCoroutine뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다.
task.delay(delay, functionOrCoroutine, ...)
코루틴을 생성한 후 delay초 뒤에 재개합니다. functionOrCoroutine 뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다.
task.defer(functionOrCoroutine, ...)
현재 실행 중인 코루틴이 종료된 즉시 코루틴 함수를 실행되도록 예약합니다. functionOrCoroutine 뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다.
task.cancel(coroutine)
아직 실행되지 않은 coroutine을 취소합니다.
1. 스레드 일시정지하기
다음은 현재 스레드를 1초간 일시정지하는 예제입니다.
local elapsedTime = task.wait(1)
print(`task.wait(1) real waited time(sec): {elapsedTime}`)
2. 즉시 코루틴 생성 및 실행하기
다음은 생성된 후 즉시 재개되는 코루틴에 여러 type의 데이터를 전달하고 출력하는 예제입니다.
local function TaskSpawn(a, b, c, tbl)
print("task.spawn executed", a, b, c)
for k, v in pairs(tbl) do
print(`["{k}"]: {v} ({typeof(v)})`)
end
end
task.spawn(TaskSpawn, "arg1", 123, true, {x = 78, y = "90"})
3. 일정 시간 뒤 코루틴 함수 실행하기
다음은 코루틴을 생성하되, 1.5초 뒤에 재개하는 예제입니다. 코루틴에 string 형태의 message를 전달하고, 생성된 coroutine을 출력합니다.
local function TaskDelay(message)
print("task.delay executed: ", message)
end
local delayedCoroutine= task.delay(1.5, TaskDelay, "Here is delayed message")
print(`delayedCoroutine: {delayedCoroutine}`)
4. 실행 중인 코루틴이 종료될 때 새로운 코루틴 함수 실행 예약하기
다음은 생성된 후 이미 실행 중인 코루틴이 종료될 때 재개되는 새로운코루틴에 몇 개의 데이터를 전달하고 출력하는 예제입니다.
local function TaskDefer(x, y)
print("task.defer executed: ", x, y)
end
task.defer(TaskDefer, "defer_arg", 456)
5. 실행 예약된 코루틴 함수 취소하기
다음은 task.spawn(), task.delay(), task.defer()로 마지막에 예약된 코루틴 함수에 대해 실행을 취소합니다. 이미 실행 중인 코루틴은 중지할 수 없습니다.
local function TaskDelayForCancel()
print("This should not be print")
end
local cancelCoroutine = task.delay(5, TaskDelayForCancel)
task.cancel(cancelCoroutine)
Last updated