루아 코루틴
코루틴이란 무엇인가요?
Lua 코루틴은 스레드와 유사합니다. 독립적인 스택, 독립적인 지역 변수 및 독립적인 명령 포인터를 가지며 전역 변수 및 기타 대부분의 항목을 다른 코루틴과 공유합니다.
협업은 매우 강력한 기능이지만 사용하기가 매우 복잡합니다.
스레드와 코루틴의 차이점
스레드와 코루틴의 주요 차이점은 여러 스레드가 있는 프로그램은 동시에 여러 스레드를 실행할 수 있는 반면, 코루틴은 각각의 스레드와 협력하여 실행해야 한다는 것입니다. 다른.
한 번에 하나의 코루틴만 실행되며, 실행 중인 코루틴은 명시적으로 일시 중지 요청을 받은 경우에만 일시 중지됩니다.
코루틴은 동기화된 다중 스레드와 다소 유사하며, 동일한 스레드 잠금을 기다리는 여러 스레드는 협업과 다소 유사합니다.
기본문법
方法 | 描述 |
---|---|
coroutine.create() | 创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用 |
coroutine.resume() | 重启coroutine,和create配合使用 |
coroutine.yield() | 挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果 |
coroutine.status() | 查看coroutine的状态 注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序 |
coroutine.wrap() | 创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复 |
coroutine.running() | 返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号 |
다음 예에서는 위 메서드 각각의 사용법을 보여줍니다.
-- coroutine_test.lua 文件 co = coroutine.create( function(i) print(i); end ) coroutine.resume(co, 1) -- 1 print(coroutine.status(co)) -- dead print("----------") co = coroutine.wrap( function(i) print(i); end ) co(1) print("----------") co2 = coroutine.create( function() for i=1,10 do print(i) if i == 3 then print(coroutine.status(co2)) --running print(coroutine.running()) --thread:XXXXXX end coroutine.yield() end end ) coroutine.resume(co2) --1 coroutine.resume(co2) --2 coroutine.resume(co2) --3 print(coroutine.status(co2)) -- suspended print(coroutine.running()) print("----------")
위 예의 실행 출력은 다음과 같습니다.
1 dead ---------- 1 ---------- 1 2 3 running thread: 0x7fb801c05868 false suspended thread: 0x7fb801c04c88 true ----------
coroutine.running에서 기본 메서드가 다음과 같은 것을 볼 수 있습니다. 코루틴의 구현은 스레드입니다.
코루틴을 생성하면 새 스레드에 이벤트가 등록됩니다.
resume을 사용하여 이벤트를 트리거하는 경우 create의 코루틴 함수가 실행됩니다. 항복이 발생하면 현재 스레드를 일시 중지하고 이벤트가 다시 트리거될 때까지 기다리는 것을 의미합니다.
다음으로 더 자세한 예를 분석합니다.
function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值 end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入 end) print("main", coroutine.resume(co, 1, 10)) -- true, 4 print("--分割线----") print("main", coroutine.resume(co, "r")) -- true 11 -9 print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- true 10 end print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine print("---分割线---")
위 예의 실행 출력은 다음과 같습니다.
第一次协同程序执行输出 1 10 foo 函数输出 2 main true 4 --分割线---- 第二次协同程序执行输出 r main true 11 -9 ---分割线--- 第三次协同程序执行输出 x y main true 10 结束协同程序 ---分割线--- main false cannot resume dead coroutine ---分割线---
위 예는 다음과 같습니다.
resume을 호출하여 코루틴을 활성화합니다. 성공하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 코루틴이 실행됩니다. 🎜>
yield 문으로 실행합니다.
yield는 코루틴을 중단하고 첫 번째 이력서가 반환됩니다. (참고: 여기서는 수익률이 반환되고 매개변수는 이력서의 매개변수입니다. )
두 번째로 재개하고 코루틴을 다시 깨웁니다. (참고: 여기서 재개 매개변수 중 첫 번째 매개변수를 제외한 나머지 매개변수는 항복 매개변수로 사용됩니다.)
yield return;
코루틴이 계속 실행됩니다.
사용된 코루틴이 계속되는 경우 실행하고 완료 후 재개 메소드를 계속 호출하면 출력: 죽은 코루틴을 재개할 수 없습니다
resume과 Yield의 강력한 조합은 이력서가 기본 프로세스에 있고 통과한다는 것입니다. 외부 상태(데이터)가 코루틴에 전달되고 항복됩니다. 그런 다음 내부 상태(데이터)가 기본 프로세스로 반환됩니다.
local newProductor function productor() local i = 0 while true do i = i + 1 send(i) -- 将生产的物品发送给消费者 end end function consumer() while true do local i = receive() -- 从生产者那里得到物品 print(i) end end function receive() local status, value = coroutine.resume(newProductor) return value end function send(x) coroutine.yield(x) -- x表示需要发送的值,值返回以后,就挂起该协同程序 end -- 启动程序 newProductor = coroutine.create(productor) consumer()
위 예의 출력 결과는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 ……