루아의 협정(coroutine)
9119 단어 coroutine
--------------------------------------------------------------------------------
--
--------------------------------------------------------------------------------
local main = function()
print("step1")
coroutine.yield()
print("step2")
end
local co = coroutine.create(main)
coroutine.resume(co)
coroutine.resume(co)
--
step1
step2
지금까지 가장 간단한 협동 시연이었습니다.
설명:
1.coroutine.create 협정 만들기
2. 첫 번째 coroutine.create는main 함수에 실행되는coroutine입니다.yield () 함수에서 중지
3. coroutine를 다시 실행합니다.create 다음에main 함수 인터럽트에서 실행합니다. 즉, main 함수를 실행하는 두 번째print
협정의 매개 변수는 좀 번거롭지만, 가장 좋은 것은 아래의 상세한 설명을 다 보면 알 수 있다. 여기에서 먼저 가장 간단한 매개 변수 전달의 예를 보여 준다
--------------------------------------------------------------------------------
--
--------------------------------------------------------------------------------
local main = function(arg1)
print (arg1)
print (coroutine.yield("yield"))
print (arg1)
end
local co = coroutine.create(main)
print(coroutine.resume(co, "resume1"))
print(coroutine.resume(co, "resume2"))
-- ouput:
resume1
true yield
resume2
resume1
true
협정에 대한 상세한 해석
Lua는 coroutine를 지원하는데 이 물건은 협동식 다중 스레드(collaborative multithreading)라고도 부른다.Lua는 모든 coroutine에 독립된 운행 노선을 제공한다.그러나 다중 스레드 시스템의 스레드와 달리 coroutine는 yield 함수를 현저하게 호출할 때만 끊습니다.
coroutine를 만들려면 한 번 coroutine.create 을 호출해야 합니다.이것은 하나의 매개 변수만 수신합니다. 이 매개 변수는 coroutine의 주 함수입니다.create 함수는 새 coroutine만 만들고 컨트롤러로 되돌려줍니다.그것은 코루틴의 운행을 시작하지 않습니다.
첫 번째 호출 coroutine.resume 을 할 때, 필요한 첫 번째 인자는 coroutine.create 의 반환값입니다.이 때, coroutine는 주 함수의 첫 줄부터 실행됩니다.다음 전송 coroutine.resume 의 매개 변수는 코루틴의 주 함수로 전송됩니다.coroutine가 실행되기 시작하면, 실행이 종료되거나 yields를 만났다고 합니다.
coroutine는 두 가지 방식으로 운행을 중지할 수 있다. 하나는 정상적으로 종료하는 것이다. 이것은 주 함수 반환을 가리킨다. (마지막 명령이 실행된 후에 현식 반환 명령이 있든 없든).또 다른 하나는 비정상적으로 종료하는 것이다. 보호되지 않은 오류가 발생할 때 발생한다.첫 번째 경우coroutine.resumetrue를 되돌려주고, 다음은coroutine 주 함수의 일련의 되돌려줍니다.두 번째 오류가 발생한 경우coroutine.resumefalse로 되돌아오는데 그 다음은 오류 메시지입니다.
coroutine에서 전환하면 호출할 수 있습니다coroutine.yield.coroutine가 자르면 그것과 결합된 coroutine.resume은 즉시 되돌아오고 심지어 yield가 내층에서 발생하는 함수 호출에서도 가능하다(즉, 이것은 주 함수에서 발생하는 것이 아니라 주 함수가 직접 또는 간접적으로 호출되는 어떤 함수에서도 가능하다).yield의 경우coroutine.resume도true로 되돌아와 전송된 파라미터coroutine.yield를 따라간다.다음에 같은 coroutine를 계속하면 yield를 호출하는 단점에서 실행됩니다.단점에 있는 yield의 반환 값은 coroutine.resume 들어오는 매개 변수입니다.
유사coroutine.create, coroutine.wrap 이 함수도 coroutine를 만들지만, coroutine 자체를 되돌리지 않고 함수를 되돌려 줍니다.이 반환 함수를 호출하면 coroutine에 삽입해서 실행합니다.이 함수에 전입된 모든 매개 변수는 전입 coroutine.resume 의 매개 변수와 같다.coroutine.wrap는 첫 번째 (오류 코드의 부울 양) 를 제외한 coroutine.resume 에서 반환해야 할 모든 값을 되돌려줍니다.coroutine.resume와 달리 coroutine.wrap 어떠한 잘못도 포착하지 않는다.모든 오류는 호출자가 스스로 전달해야 한다.
Lua언어가 실현하는 협정은 비대칭식(asymmetric) 협정으로 또는 반대칭식(semi-symmetric) 협정이라고 부르거나 아예 반협정(semi-coroutine)이라고 부른다.
이러한 협정 메커니즘이 비대칭이라고 불리는 이유는 두 가지 전달 프로그램 제어권의 조작을 제공했기 때문이다.
하나는 (다시) 호출 협정 (coroutine.resume를 통해) 이다.
다른 하나는 프로토콜을 끊고 프로그램 제어권을 프로토콜의 호출자 (coroutine.yield) 에게 되돌려주는 것이다.
비대칭 협정은 그것의 호출자에 속하는 것으로 볼 수 있으며, 양자의 관계는 루틴(routine)과 그 호출자 간의 관계와 매우 유사하다.비대칭식 협정이 있는 이상 당연히 대칭식(symmetric) 협정도 있다. 그 특징은 전달 프로그램 제어권의 조작만 있고 곧 통제권이 지정한 협정에 직접 전달된다는 것이다.일찍이 대칭식과 비대칭식 협동 메커니즘의 능력은 결코 등가가 아니지만 사실상 전자에 따라 후자를 실현하기 쉽다는 설이 있었다.
coroutine.create (f)
Creates a new coroutine, with body f. f must be a Lua function. Returns this new coroutine, an object with type "thread".
coroutine.resume (co [, val1, ···])
Starts or continues the execution of coroutine co. The first time you resume a coroutine, it starts running its body. The values val1, ··· are passed as the arguments to the body function. If the coroutine has yielded, resume restarts it; the values val1, ··· are passed as the results from the yield.
If the coroutine runs without any errors, resume returns true plus any values passed to yield (if the coroutine yields) or any values returned by the body function (if the coroutine terminates). If there is any error, resume returns false plus the error message.
coroutine.running ()
Returns the running coroutine, or nil when called by the main thread.
coroutine.status (co)
Returns the status of coroutine co, as a string: "running", if the coroutine is running (that is, it called status); "suspended", if the coroutine is suspended in a call to yield, or if it has not started running yet; "normal" if the coroutine is active but not running (that is, it has resumed another coroutine); and "dead" if the coroutine has finished its body function, or if it has stopped with an error.
coroutine.yield (···)
Suspends the execution of the calling coroutine. The coroutine cannot be running a C function, a metamethod, or an iterator. Any arguments to yield are passed as extra results to resume.
coroutine.wrap (f)
Creates a new coroutine, with body f. f must be a Lua function. Returns a function that resumes the coroutine each time it is called. Any arguments passed to the function behave as the extra arguments to resume. Returns the same values returned by resume, except the first boolean. In case of error, propagates the error.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
안드로이드에서 Kotlin coroutine (Async, Await)을 사용하여 Sakut과 HTTP 통신 (비동기 처리)REST API를 두드려 얻은 결과를 바탕으로 UI를 업데이트 할 때 HTTP 통신은 메인 스레드 외부에서 수행되어야합니다 (비동기 처리 필요) 취득한 json 데이터의 퍼스가 번거로움( , 등 여러가지 라이브러리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.