coroutine

사용되지 않는 항목 표시

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

A 코루틴 은 동일한 스크립트 내에서 여러 태스크를 동시에 수행하기 위해 사용됩니다.이러한 작업에는 입력에서 값을 생성하거나 큰 문제를 해결할 때 하위 루틴에서 작업을 수행하는 것이 포함될 수 있습니다.태스크에는 정의된 종료 지점이 필요하지 않지만, 다른 사람들이 작업을 수행할 수 있도록 특정 시간을 정의해야 합니다( 중지 ).

코루틴 사용

새로운 코루틴은 coroutine.create()에 함수를 제공하여 생성할 수 있습니다.생성되면 코루틴은 함수에 인수를 전달하는 첫 번째 호출인 coroutine.resume() 이 수행될 때까지 실행을 시작하지 않습니다.이 호출은 함수가 중단되거나 호출되면 coroutine.yield() 을 반환하고, 이 일이 발생하면 coroutine.resume() 는 함수에서 반환된 값, coroutine.yield() 에 전송된 값 또는 오류 메시지를 반환합니다.오류가 발생하면 두 번째 반환 값은 발생한 오류입니다.


local function task(...)
-- 이 함수는 약간의 작업을 수행한 다음 일부 값을 반환할 수 있습니다
coroutine.yield("first") -- coroutine.resume()에 의해 반환될 예정
-- 함수는 다시 시작되면 계속됩니다
return "second"
end
local taskCoro = coroutine.create(task)
-- 처음부터 함수를 실행하는 첫 번째 시간 중단 호출
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, 먼저(코루틴.yield()라는 작업 호출)
-- 계속 실행하여 결과를 반환하거나 중지할 때까지 함수 실행 계속
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

코루틴의 수명 동안 상태를 확인하려면 coroutine.status()를 호출할 수 있습니다:


<th>의미</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>일시 중지됨</b></td>
<td>코루틴이 재개되기를 기다리고 있습니다. 코루틴은 이 상태에서 시작하고 함수가 <code>coroutine.yield()</code>를 호출할 때 그것에 들어갑니다.</td>
</tr>
<tr>
<td><b>실행 중</b></td>
<td>코루틴이 지금 실행 중입니다.</td>
</tr>
<tr>
<td><b>일반</b></td>
<td>코루틴이 다른 코루틴의 생성을 기다리고 있습니다(즉, 다른 코루틴을 재시작했습니다).</td>
</tr>
<tr>
<td><b>사망</b></td>
<td>함수가 중지되었습니다(오류를 반환하거나 던졌음). 코루틴은 더 이상 사용할 수 없습니다.</td>
</tr>
</tbody>
상태

코루틴 래핑

코루틴을 사용할 때 코루틴 개체의 사용을 포기하고 대신 래퍼 함수를 사용할 수도 있습니다.이러한 래퍼 함수는 호출될 때 특정 코루틴을 재개하고 제공된 값만 반환합니다.다음을 사용하여 수행할 수 있습니다 coroutine.wrap() :


-- 코루틴 생성 및 중단 상태를 재개하는 래퍼 함수 반환
local f = coroutine.wrap(task)
-- 코루틴을 호출한 것처럼 코루틴을 재시작합니다.resume()
local result = f()
-- 오류가 발생하면 여기에서 발생합니다!
-- This differs from coroutine.resume() which acts similar to pcall()

coroutine.resume()에서 반환된 첫 번째 값은 코루틴이 오류 없이 실행되었는지 여부를 설명합니다.그러나, coroutine.wrap()에서 반환된 함수는 이렇게 하지 않습니다: 대신 반환되거나 전달된 값을 직접 coroutine.yield()에 반환합니다, 있는 경우.코루틴 함수를 실행하는 동안 오류가 발생하면 반환된 함수의 호출에서 오류가 발생합니다.

프로듀서 패턴 예시

단어의 반복을 생성하는 작업을 상상해 보십시오: 반복을 생성할 때마다 다음 작업은 하나 더 생성합니다.예를 들어, Hello 를 제공하면 Hello , HelloHello , HelloHelloHello 등이 생성됩니다.이를 수행하려면 repeatThis()를 정의할 수 있습니다.


-- 이 함수는 코루틴이 재개될 때마다 단어를 반복합니다
local function repeatThis(word)
local repetition = ""
while true do
-- 한 번 반복한 다음 결과 제공
repetition = repetition .. word
coroutine.yield(repetition)
end
end

이 함수를 코루틴으로 실행하려면 coroutine.create()를 사용한 다음 여러 번 coroutine.resume()에 호출할 수 있습니다.


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- true, 헬로
print(coroutine.resume(repetitionCoro)) -- 참, HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

이 생산자 함수에서는 값을 생성하는 함수를 얻기 위해 coroutine.wrap()를 사용할 수도 있습니다:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- 헬로
print(f()) -- 헬로헬로
print(f()) -- HelloHelloHello

함수

close

매개 변수

반환

Variant<string, ()>

create

매개 변수

반환

isyieldable

반환

resume

매개 변수

...: Variant

반환

running

반환

status

매개 변수

반환

매개 변수

반환

yield

Tuple<Variant>

매개 변수

...: Tuple

반환

Tuple<Variant>