루아 코 루틴 (코 루틴)
상승 (코 루틴) 란 무엇입니까?
루아 코 루틴 (코 루틴) 스레드 상대적으로 유사한 독립적 인 스택 지역 변수가 분리, 독립 명령 포인터뿐만 아니라 공유 전역 변수, 그리고 대부분의 다른 것들과 다른 협력 프로그램.
시너지는 매우 강력한뿐만 아니라, 매우 사용하기 복잡하다.
스레드와 코 루틴의 차이
프로그램이 협력 프로그램은 다른 협력에 대해 필요하지만, 동시에 여러 스레드를 실행할 수있는 여러 스레드가 스레드와 코 루틴의 주요 차이점.
주어진 시간에 하나의 협력 프로그램이 실행되며, 실행중인 코 루틴은 일시 중지됩니다 일시 중단 된 시간을 지울 필요가있다.
잠금 여러 스레드 다소 유사한 협력을 기다리고 같은 스레드에서 여러 스레드를 동기화 다소 유사한 협력 프로그램입니다.
기본 구문
방법 | 기술 |
---|---|
coroutine.create () | 인수와 함께 사용하는 기능이며, 코 루틴을 반환하는 코 루틴을 만들 때 웨이크 업 함수 호출을 재개 |
coroutine.resume () | 코 루틴을 다시 시작하고를 사용하여 작성 |
coroutine.yield () | 일시 중단 된 코 루틴은 보류 상태 및 이것의 사용으로 재개에 코 루틴은 유용한 효과를 많이해야합니다 |
coroutine.status () | 코 루틴 참고의 상태를 확인합니다 : 코 루틴의 상태를, 세 가지가 있습니다 : 죽은, 일시 중지, 이러한 상태가있을 때 특히, 다음 절차를 참조하십시오, 실행 |
coroutine.wrap () | 일단 당신이,이 함수를 호출 코 루틴을 입력 함수가 반환하는 코 루틴을 만들고 반복 함수를 작성 |
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, 코 루틴 구현 하단 스레드이다.
때 이벤트가 새 스레드에 등록 될 때 코 루틴을 만들 수 있습니다.
이력서 이벤트가 트리거 될 때 코 루틴 함수가 실행될 때, 만들고, 대신 수율에 직면했을 때 다시 대기 이벤트를 트리거 재개 현재 스레드를 일시 중단합니다.
다음으로,보다 상세한 예를 분석 :
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 ---分割线---
다음과 같은 예를 점거했다 :
- 그렇지 않으면 false를 반환 사실 조작 성공적인 복귀를 재개, 웨이크 업을 조율, 이력서 전화;
- 공동 프로그램이 실행;
- 문을 산출하기 위해 실행;
- (여기 항복 반환 매개 변수 매개 변수입니다 재개 주) 수익률은 코 루틴 첫 번째 이력서 반환을 일시 중단
- 둘째 이력서, 모닝콜가 다시 코 루틴 (주 :이 재개 파라미터는 첫번째 인자 이외에 나머지 매개 변수는 매개 변수로서 수득한다)
- 수율 반환;
- 공동 프로그램은 계속 실행;
- 당신이 협력 프로그램을 계속 실행 방법은 출력의 완료 후 다시 시작 전화를 계속 사용하는 경우 : 죽은 코 루틴을 재개 할 수 없습니다
메인 프로그램에서 해당 이력서 및 수율, 이력서와 장소의 힘, 그것은 (데이터) 내부 조정 절차에 전달 된 상태 외부에있을 것입니다, 그리고 내부 상태 (데이터)를 생산하는 주요 프로세스에 반환됩니다.
생산자 - 소비자 문제
이 고전적인 문제의 소비자는 - 지금은 생산자가 루아 코 루틴을 사용하여 완료합니다.
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 ……