lua协程coroutine

协程是单线程运行的,它只是提供了一种代码在当前位置暂停,后续还能在当前位置恢复继续执行下去的机制。

 

1, 启动协程, 以及yield

local co1Func = function(str1, str2)
    for i=1,2 do
        print("-----", i, str1, str2)
        local str3, str4 = coroutine.yield(i) --返回值为resume的参数,即:a1, a2; b1, b2那些
        print("-----", i, str3, str4)
    end
    print("----- exit", coroutine.running())
end

local co1 = coroutine.create(co1Func)
print("running:", coroutine.running())

local isSucc, result = coroutine.resume(co1, "a1", "a2") --返回值为yield的参数,即:i的值
print("resume1:", isSucc, result, coroutine.status(co1))

isSucc, result = coroutine.resume(co1, "b1", "b2")
print("resume2:", isSucc, result, coroutine.status(co1))

isSucc, result = coroutine.resume(co1, "c1", "c2")
print("resume3:", isSucc, result, coroutine.status(co1))

 

运行结果:

running:
----- 1 a1 a2
resume1: true 1 suspended
----- 1 b1 b2
----- 2 a1 a2
resume2: true 2 suspended
----- 2 c1 c2
----- exit thread: 0095D2B8
resume3: true nil dead

 

 

2, 嵌套协程

local coSubFunc = function(str1, str2)
    for i=1,2 do
        print("----------coSub", i, str1, str2)
        local str3, str4 = coroutine.yield(i) --返回值为resume的参数,即:a1, a2; b1, b2那些
        print("----------coSub", i, str3, str4)
    end

    print("----------coSub exit", coroutine.running())
end

local coMainFunc = function(str1, str2)
    local coSub = coroutine.create(coSubFunc)
    print("-----coMain", str1, str2, coroutine.running())

    --调用了resume, 子协程才启动; 启动后, 主协程会挂起(suspended), 直到嵌套协程执行结束或yield
    local isSucc, result = coroutine.resume(coSub, "aa1", "aa2") --返回值为yield的参数
    print("-----coMain resume1", isSucc, result, coroutine.running(), coroutine.status(coSub))

    isSucc, result = coroutine.resume(coSub, "bb1", "bb2")
    print("-----coMain resume2", isSucc, result, coroutine.running(), coroutine.status(coSub))

    print("-----coMain exit", coroutine.running())
end

local coMain = coroutine.create(coMainFunc)
print("running:", coroutine.running())

local isSucc, result = coroutine.resume(coMain, "a1", "a2")
print("main a", isSucc, result, coroutine.running(), coroutine.status(coMain))

isSucc, result = coroutine.resume(coMain, "b1", "b2")
print("main b", isSucc, result, coroutine.running(), coroutine.status(coMain))

运行结果:

running:
-----coMain a1 a2 thread: 009BD940
----------coSub 1 aa1 aa2
-----coMain resume1 true 1 thread: 009BD940 suspended
----------coSub 1 bb1 bb2
----------coSub 2 aa1 aa2
-----coMain resume2 true 2 thread: 009BD940 suspended
-----coMain exit thread: 009BD940
main a true nil nil dead
main b false cannot resume dead coroutine nil dead

 

coroutine.resume

local isSucc, result1, result2 = coroutine.resume(co)

1) 如果协程中途yield,则返回值为yield的参数;如果中途没有yield,则返回值为nil

2) 如果resume的协程已经dead,则会resume失败

 

coroutine.yield

local resumeParam1, resumeParam2 = coroutine.yield(arg1, arg2)

返回值为resume的参数

 

coroutine.status

获取协程状态:running, suspended(挂起), dead

 

coroutine.running()

获取当前在运行的协程

local co, isMain = coroutine.running()

 

posted @ 2024-02-28 22:45  yanghui01  阅读(60)  评论(0编辑  收藏  举报