深入浅出游戏算法(3)-lua脚本(8)

协同程序

与多线程类似,但是任意时刻仅能运行一个协同程序,这点与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:~ % 

通过协同程序计算累加,与上面的不同之处在于,通过在yieldresume后加上参数,在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

计算完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值