lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

参考链接:

https://www.runoob.com/lua/lua-coroutine.html

https://www.jb51.net/article/64691.htm

 

一.常用方法

1.coroutine.create() 创建协程

2.coroutine.resume() 恢复协程

3.coroutine.yield() 挂起协程

4.coroutine.status() 返回协程的状态

 

测试:

复制代码
co = coroutine.create(function ()
    for i = 1, 10 do
        print(i)
        coroutine.yield()
    end
end)

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)

-- 输出:
-- 1
-- 2
-- 3
复制代码

 

二.常用状态

1.suspended 挂起状态。创建协程(create)和挂起协程(yield)后,协程会处于挂起状态

2.running 运行状态。恢复协程(resume)后,协程会处于运行状态

3.dead 停止状态。协程运行结束后处于停止状态

 

测试:

复制代码
co = coroutine.create(function ()
    print(coroutine.status(co))
    print("hi")
end)

print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))

-- 输出:
-- suspended
-- running
-- hi
-- dead
复制代码

 

三.resume和yield之间的数据交换

1.调用resume后,将会从协程起始处或挂起处执行。如下,第一次执行resume,会将参数1,2,3直接传递给协程;第二次执行resume,会从挂起处执行,将参数4,5,6传递给yield(见下例子2),此时再次print,打印的是初次传递给协程的参数

复制代码
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    coroutine.yield()
    print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)

--输出:
-- co    1    2    3
-- co2    1    2    3
复制代码

 

2.将上面的例子稍微修改下。可以看到,yield的返回值为resume的参数

复制代码
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    print(coroutine.yield())
    print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)

--输出:
-- co    1    2    3
-- 4    5    6
-- co2    1    2    3
复制代码

 

3.再次将上面的例子稍微修改下。可以看到,resume的返回值为true和yield的参数,其中true表示执行成功无报错,如果出现报错则返回值为false和报错信息

复制代码
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    print(coroutine.yield("haha", 999))
    print("co2", a, b, c)
end)
print(coroutine.resume(co, 1, 2, 3))
print(coroutine.resume(co, 4, 5, 6))

--输出:
-- co    1    2    3
-- true    haha    999
-- 4    5    6
-- co2    1    2    3
-- true
复制代码

 

4.resume的返回值也可以为true和return的值。return和yield的不同在于,yield后协程处于挂起状态(suspended),而return后协程处于停止状态(dead)

复制代码
co = coroutine.create(function ()
    return 6, 7
end)
print(coroutine.resume(co)) 
print(coroutine.resume(co))

--输出:
-- true    6    7
-- false    cannot resume dead coroutine
复制代码

 

总结:

resume和yield的配合强大之处在于,resume处于主程中,它将外部状态(数据)传入到协同程序内部;而yield则将内部的状态(数据)返回到主程中。

posted on   艰苦奋斗中  阅读(226)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示