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

来源:互联网 发布:京东微信端口什么意思 编辑:程序博客网 时间:2024/05/22 05:15

协同程序

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

计算完成

0 0
原创粉丝点击