Lua的协同程序
Lua是一种简单,可扩展,可移植及高效的脚本语言。在嵌入式系统,移动设备,web服务器,游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与C语言或者其他语言。 这里说的是lua语言中的协同程序(coroute),也有人翻译成为协作程序 基本函数和语法coroutine就是lua的协同程序 先讲一下coroutine的语法:coroutine.create(
|
co = coroutine.create(
????
function
(i)
????????
print
(i);
????
end
)
?
coroutine.resume(co,1)?? -- 1
(coroutine.status(co))? -- dead
?
(
"----------"
)
?
co = coroutine.wrap(
(i)
(i);
end
)
?
co(1)
?
)
?
co2 = coroutine.create(
()
????????
for ?
i=1,10
do
????????????
(i)
????????????
if ?
i == 3 then
????????????????
(coroutine.status(co2))? --running
(coroutine.running()) --thread:XXXXXX
end
????????????
coroutine.
yield
()
end
end
)
?
coroutine.resume(co2) --1
coroutine.resume(co2) --2
coroutine.resume(co2) --3
?
(coroutine.status(co2))?? -- suspended
(coroutine.running())?? --nil
?
)
|
返回数据:
coroutine.running就可以看出来,coroutine在底层实现就是一个线程。当create一个coroutine的时候就是在新线程中注册了一个事件。当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。
分析学习coroutine的时候经常遇到的一个程序
源程序可以看这里
我稍微做了点修改,增加了一下分隔符:
理解完上面这个程序,再看看coroutine2的程序,这里把每个输出执行了哪些步骤列出来了:
- print("main",10)) 执行了:
print("co-body",10)print("foo",2)coroutine.resume(co,10) 返回 true,4 (!!这里的4是yield的参数)print("main",true,4)
- print("main","r")) 执行了:
foo(a) 返回了 "r" (这是由yield返回的)print("co-body2","r")coroutine.resume(co,"r") 返回 true,11 -9 (!!这里的a和b还是用1和10计算的)print("main",11 -9)
- print("main","x","y"))执行了:
local r,a - b) r和s值为x和yprint("co-body3","y")return b,"end" //此时coroutine线程结束,为dead状态coroutine.resume(co,"y") 返回值为 true 10 endprint("main",true 10 end)
- print("main","y"))执行了:
由于coroutine.resume(co,"y")已经dead了,所以这里返回false
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!