GaGe

Lua_Study(9장) 코루틴 본문

Study/Lua

Lua_Study(9장) 코루틴

Sorrel 2022. 7. 14. 17:48

코루틴은 corutine테이블로 사용한다.

스레드들이 동시에 한번에 돌아가는 형태가 아니라 한 번에 한 코루틴만 수행된다.

 

코루틴의 생성

코루틴은 생성된 코루틴을 표현하는 thread 타입의 값을 반환한다. 

co = corutine.create(function() print("hi") end)

 

코루틴의 상태

  • suspended(중지) --> 다음에 다시 실행할 수 있음
  • running(실행 중)
  • dead(종료)
  • normal(일반)
print(corutine.status(co))

suspended --- resume ---> running ------> dead

 

 

yield

실행 중인 코루틴을 중지하고 나중에 다시 실행할 수 있는 상태로 바꾼다. 

co = corutine.create(function()
	for i = 1, 10 do
    	print("co", i)
        coroutine.yield()
    end
end)

yield를 사용하면 코루틴이 dead 상태가 아닌 suspended 상태가 되어 나중에 다시 또 사용할 수 있게 된다.

 

예제

function Test (Name)
    print(Name.." running...")
end

function Test2(Name)
    print(Name.." running...")
    coroutine.yield("yield function called")
end

--Test를 코루틴으로 생성
cr1 = coroutine.create(Test)
--Test코루틴 상태 출력
print("status of cr1 : ".. coroutine.status(cr1))

--coroutine.resume()은 print에서 ..로 붙여서 사용하면 에러
--print("coroutine.resume(cr1) : "..coroutine.resume(cr1, "cr1"))

--cr1은 yield 없음
print("coroutine.resume(cr1)")
print(coroutine.resume(cr1, "cr1"))
print("status of cr1 : "..coroutine.status(cr1)) --dead
print("")

--Test2는 yield 존재
print("create cr2 ")
cr2 = coroutine.create(Test2)
print(coroutine.resume(cr2, "cr2"))
print("status of cr2 : "..coroutine.status(cr2)) --suspended

결과창

 

coroutine.wrap

- create 와 같은 기능을 한다. 리턴하는 값에 차이가 있다. create는 코루틴 자체를 리턴하고, wrap은 함수를 리턴.

function Test()
    print("안녕하세요... 월드 1")
    coroutine.yield(1)
    print("안녕하세요... 월드 2")
    coroutine.yield(2)
    print("안녕하세요... 월드 3")
end

cr1 = coroutine.wrap(Test)
cr2 = coroutine.create(Test)

print("cr1(wrap)")
print(cr1())
print(cr1())
print(cr1())
print("cr2(create)")
print(cr2)
print(cr2)
print(cr2)

create는 첫번째 리턴값이  Boolean이 었는데 비해,
wrap으로 생성된 코루틴은 그 값이 없다는 것이다. 나머지 뒤에 매개변수들이 리턴되는 것은 같다.

 

 

Iterator

-- iterator가 데이터를 구성하기 위한 함수
crIterator = coroutine.wrap(function (value)
    for i =1, #value, 2 do
        coroutine.yield(value[i])
    end

    if #value>2 then
        for i =2, #value, 2 do
            coroutine.yield(value[i])
        end
    end
end)

-- iterator 작성
function myPairs(table)
    return function ()
        return crIterator(table)
    end
end

--사용 예
animals = {"monkey","tiger","cheetah","elephant"}
for v in myPairs( animals ) do
    print(v)
end

 

'Study > Lua' 카테고리의 다른 글

Lua_Study(8장)  (0) 2022.07.12
Lua_Study(dofile vs loadfile vs load)  (0) 2022.07.12
Lua_Study(pairs와 ipairs의 차이점)  (0) 2022.07.12
Lua_Study(6장)  (0) 2022.07.11
Lua_Study(5장)  (0) 2022.07.11
Comments