Latest web development tutorials

루아 코 루틴 (코 루틴)

상승 (코 루틴) 란 무엇입니까?

루아 코 루틴 (코 루틴) 스레드 상대적으로 유사한 독립적 인 스택 지역 변수가 분리, 독립 명령 포인터뿐만 아니라 공유 전역 변수, 그리고 대부분의 다른 것들과 다른 협력 프로그램.

시너지는 매우 강력한뿐만 아니라, 매우 사용하기 복잡하다.

스레드와 코 루틴의 차이

프로그램이 협력 프로그램은 다른 협력에 대해 필요하지만, 동시에 여러 스레드를 실행할 수있는 여러 스레드가 스레드와 코 루틴의 주요 차이점.

주어진 시간에 하나의 협력 프로그램이 실행되며, 실행중인 코 루틴은 일시 중지됩니다 일시 중단 된 시간을 지울 필요가있다.

잠금 여러 스레드 다소 유사한 협력을 기다리고 같은 스레드에서 여러 스레드를 동기화 다소 유사한 협력 프로그램입니다.

기본 구문

방법 기술
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
……