알맹이방
Lua_Study(9장) 코루틴 본문
코루틴은 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