5.携程

image

代码:

print("**********协同程序************")

print("**********协程的创建************")
--常用方式
--coroutine.create()
fun = function()
    print(123)
end
co = coroutine.create(fun)
--协程的本质是一个线程对象
print(co)
print(type(co))

--coroutine.wrap()
co2 = coroutine.wrap(fun)
print(co2)
print(type(co2))

print("**********协程的运行************")
--第一种方式 对应的 是通过 create创建的协程
coroutine.resume(co)
--第二种方式
co2()

print("**********协程的挂起************")
fun2 = function( )
    local i = 1
    while true do
        print(i)
        i = i + 1
        --协程的挂起函数
        print(coroutine.status(co3))
        print(coroutine.running())
        coroutine.yield(i)
    end
end

co3 = coroutine.create(fun2)
--默认第一个返回值 是 协程是否启动成功
--yield里面的返回值
isOk, tempI = coroutine.resume(co3)
print(isOk,tempI)
isOk, tempI = coroutine.resume(co3)
print(isOk,tempI)
isOk, tempI = coroutine.resume(co3)
print(isOk,tempI)

co4 = coroutine.wrap(fun2)
--这种方式的协程调用 也可以有返回值 只是没有默认第一个返回值了
print("返回值"..co4())
print("返回值"..co4())
print("返回值"..co4())

print("**********协程的状态************")
--coroutine.status(协程对象)
--dead 结束
--suspended 暂停
--running 进行中
print(coroutine.status(co3))
print(coroutine.status(co))

--这个函数可以得到当前正在 运行的协程的线程号
print(coroutine.running())

输出:

**********协同程序************
**********协程的创建************
thread: 00BEECD0
thread
function: 00BE27C0
function
**********协程的运行************
123
123
**********协程的挂起************
1
running
thread: 00BE9538
true    2
2
running
thread: 00BE9538
true    3
3
running
thread: 00BE9538
true    4
1
suspended
thread: 00BE96B0
返回值2
2
suspended
thread: 00BE96B0
返回值3
3
suspended
thread: 00BE96B0
返回值4
**********协程的状态************
suspended
dead
nil

本文介绍了Lua中的协同程序(协程)机制,主要内容包括:1)协程的两种创建方式(coroutine.create和coroutine.wrap);2)协程运行的两种方法;3)协程的挂起操作(yield)及状态管理;4)协程的三种状态(dead/suspended/running)查询方法。通过示例代码演示了协程的创建、执行、挂起恢复过程,并展示了如何获取协程状态和当前运行协程信息。

最后修改:2025 年 06 月 04 日
如果觉得我的文章对你有用,请随意赞赏