Lua协同程序(COROUTINE)运行步骤分解
运行 步骤 lua 分解 coroutine 协同程序
2023-06-13 09:15:40 时间
这是一段分析lua协程(协同程序,coroutine)的代码,来自Luareferencemanualinterface(略有修改):
functionfoo(a)
print("foo",a)
returncoroutine.yield(2*a)
end
co=coroutine.create(function(a,b)
print("co-body1",a,b)
localr=foo(a+1)
print("co-body2",r)
localr,s=coroutine.yield(a+b,a-b)
print("co-body3",r,s)
returnb,"end"
end)
print("1----")
print("main",coroutine.resume(co,1,10))
print("2----")
print("main",coroutine.resume(co,"r"))
print("3----")
print("main",coroutine.resume(co,"x","y"))
print("4----")
print("main",coroutine.resume(co,"x","y"))
运行效果如下:
1------
co-body1 1 10
foo2
main true 4
2------
co-body2 r
main true 11 -9
3------
co-body3 x y
main true 10 end
4------
main false cannotresumedeadcoroutine
这里一共调用了4次resume,让我们来看看它是怎么运行的。
第一次:
print("main",coroutine.resume(co,1,10))
1.执行print("co-body1",a,b),a和b的值为resume提供,a=1,b=10;
2.计算a+1=2,进入foo(a),同时将刚才的计算结果通过a参数传递,执行print("foo",a);
3.考虑returncoroutine.yield(2*a);
4.计算2*a=4,碰到yield,挂起foo(a)调用,将4返回给resume。注意,foo的return还没有执行;
5.resume执行成功,返回true,4。
第二次:
print("main",coroutine.resume(co,"r"))
1.从上一次挂起的foo(a)调用开始执行,接着执行没有完成的return调用;
2.因为yield返回resume的调用参数,此时foo(a+1)返回的值就是字符串"r"。这里比较难理解。
因为大家可能会顺理成章地认为localr这个变量的值应该是yield(2*a)中的2*a的值。
需要注意的是,yield的返回值与yield参数的值是不同的。
前者你可以将其保存在一个变量中,或者return它,或者不使用它(不保存yield的返回结果);后者则是resume的返回值。
3.执行print("co-body2",r),r的值为"r";
4.考虑localr,s=coroutine.yield(a+b,a-b);
5.计算a+b=11,a-b=-9,碰到yield,挂起co的调用,将11和9返回给resume。注意,此时localr,s的赋值还没有开始。
这里不太好理解的是,为什么a的值不是"r"?因为"r"已经被上面的yield的返回值给消费掉了。
6.resume执行成功,返回true,11,-9。
第三次:
print("main",coroutine.resume(co,"x","y"))
1.从上一次yield的地方开始执行,接着执行没有完成的localr,s=赋值。上面提到,yield会返回resume的调用参数,因此r和s的值就是"x"和"y";
2.执行print("co-body3",r,s)进行打印;
3.考虑returnb,"end";
4.b的值一直都是10没有变,这里直接返回了,同时返回的还有"end"这个字符串;
5.由于协程函数返回的时候,它的所有返回值都作为resume的返回值返回。因此这里的resume执行成功,返回10,"end"。
第四次:
print("main",coroutine.resume(co,"x","y"))
由于co函数已经返回,它处于dead状态,不能resume,因此第4次resume失败。
相关文章
- 在m1/m2芯片的mac电脑上运行Stable Diffusion的全步骤
- IOS内测记录:在自有App中运行小程序游戏
- 使用nginx + uWSGI运行flask程序
- 本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT
- 【错误记录】PyCharm 运行 Python 程序报错 ( SyntaxError: Non-ASCII character ‘xe5‘ in file x.py on line 1, but )
- 在Linux上运行C程序:一个步骤指南(linux运行c程序)
- Eclipse+PyDec运行Python程序
- VS Code运行C和C++程序
- Linux实战:使用Lua运行脚本(linux运行lua)
- 极速部署:借助Linux服务器快速运行程序(linux服务器运行程序)
- 简单步骤:Linux编译运行快速指南(linux如何编译运行)
- 在3DS上运行Linux:一种新的体验(3dslinux)
- 查找Linux中运行的进程:使用端口号(linux端口号查进程)
- 解析Linux运行缓慢问题,优化电脑性能(linux运行慢)
- SQL Server无法启动:排查故障的步骤(sqlserver不运行)
- SQL Server 监控:提高数据库运行效率(sqlserver监听)
- 让Windows运行Linux:展现技术魅力的可能性(win下linux)
- 超过了脚本运行的最长时间..Server.ScriptTimeOut属性指定新值