协同程序
与多线程类似,但是任意时刻仅能运行一个协同程序,这点与PYTHON的全局锁(GIL)机制相似(GIL的目标是确保每一个interpreter进程,只能同时仅有一个线程来执行, 获得相关的锁, 存取相关的资源,借此达到线程安全)
dp@dp:~ % vim mysum.lua
my_sum=0
mysum=coroutine.create(function ()
while true do
print("请输入一个数(输入0退出计算)")
num=io.read("*number")
if not num then print("输入错误,非数字输入!") end
if num==0 then break end
my_sum=my_sum+num
end
end
)
coroutine.resume(mysum)
print("计算完毕,累加结果:"..my_sum)
dp@dp:~ % lua mysum.lua
请输入一个数(输入0退出计算)
234
请输入一个数(输入0退出计算)
-435
请输入一个数(输入0退出计算)
4334
请输入一个数(输入0退出计算)
-234
请输入一个数(输入0退出计算)
-11
请输入一个数(输入0退出计算)
aa
输入错误,非数字输入!
计算完毕,累加结果:3888
dp@dp:~ %
通过协同程序计算累加,与上面的不同之处在于,通过在yield与resume后加上参数,在2个协同程序之间进行数据的传递:
dp@dp:~ % cat mysum.lua
mysum=coroutine.create(function (iscont)
local my_sum=0
while true do
if not iscont then break end
print("请输入一个数(输入任意字符,退出计算)")
num=io.read("*number")
if not num then print("退出程序!");return end
my_sum=my_sum+num
coroutine.yield(my_sum,num)
end
end
)
while true do
is_suc,result=coroutine.resume(mysum,true)
print(coroutine.status(mysum))
if result==nil then print("计算完成");coroutine.resume(mysum,false);break end
if result~=nil then print("累计:"..result) end
end
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
执行
dp@dp:~ % lua mysum.lua
请输入一个数(输入任意字符,退出计算)
234
suspended
累计:234
请输入一个数(输入任意字符,退出计算)
-232
suspended
累计:2
请输入一个数(输入任意字符,退出计算)
asdf
退出程序!
dead
计算完成