lua学习笔记---协同程序(coroutine)

对于协同程序在真正应用中怎么使用还不太明白,先写下它的使用方法供日后研究吧。直接上代码:

co=coroutine.create(
function(a,b)
print(a+b)
coroutine.yield(a*b)
print(a-b)
end
)
data1,data2= coroutine.resume(co,2,3)
print(data1,data2)
coroutine.resume(co)

co1=coroutine.wrap(
function(c,d)
print(c,d)
end
)
co1(1,2)

协同程序的定义:

1.co=coroutine.create(function(...)end)  

2.co1=coroutine.wrap(function(...)end)  

协同程序的挂起

coroutine.yield(...)这里括号内填什么,就是什么返回值,默认第一个返回值是true或者false。代表该协同程序是否执行。获取返回值从第二个值开始。

协同程序的执行

1.coroutine.resume(co,...)              如果是按上面方法1定义的方法,需要通过coroutine.resume来执行

2.co1(...)                                         如果按方法2定义的方法,可以直接通过方法的形式执行

再看下面代码,一个协同程序如果没有被挂起,无法再用resume去执行该行数。

co=coroutine.create(
function(a,b)
return(a+b)
end
)
data1,data2= coroutine.resume(co,2,3)
print(data1,data2)
data1,data2=coroutine.resume(co,2,4)
print(data1,data2)

得到的返回值为

true    5
false    cannot resume dead coroutine

这里看到再次执行这个协同程序时,不会再执行里边的代码。因为当全部执行完一次之后,已经处于dead状态,不会再被执行。这里就涉及到协同程序状态的概念。

获取协同程序的执行状态

coroutine.status(co)

而协同程序的状态有三种:

挂起状态:suspended    当该协同程序没有被执行或未全部执行完时

执行状态:running        当程序正在方法内执行时

终止状态:dead       当全部执行完毕时

一个协同程序中可以有多个yield存在。举例:

co=coroutine.create(
function(a,b)
print(coroutine.status(co))            ---running
coroutine.yield(a+b)
print(a,b)
coroutine.yield(a+b)
print(a-b)
end
)
data1,data2= coroutine.resume(co,2,3)
print(data1,data2)                   ------true,5
print(coroutine.status(co))                     -----suspended
data1,data2=coroutine.resume(co,2,4)
print(data1,data2)                    --------true,5
print(coroutine.status(co))
data1,data2=coroutine.resume(co,2,4)     ------true,nil
print(data1,data2)
print(coroutine.status(co))         ----dead

这里一定要注意的一点是:当第二次再调用该协同程序时,虽然传进去的是2,4,但这里还是以第一次传进来的2,3作为a,b的值进行的运算。所以后面执行的时候,是可以不再传2,4进去的。将打印结果输出:

running
true    5
suspended
2    3
true    5
suspended
-1
true    nil
dead

这里写一个lua菜鸟教程中对于生产者消费者问题,针对协成的应用。

意思就是我作为消费者想要某个产品,我发出这个订单给生产者,生产者做好之后把产品发回来。然后消费者继续去发出下一个订单。再下面这个例子中,生产者不需要知道消费者到底需要做多少个,因为每次做完,我就等你下一个请求。我只需要知道你从多少开始制作就行。

local newProductor

function productor(min)
     local i =min
     while true do
          i = i + 1
          send(i)     -- 将生产的物品发送给消费者
     end
end

function consumer(min,max)
local j=min
     while j

得到的结果就是从10一直输出到了300

有点明白为什么叫协同程序了,就是需要两个程序合作交互完成某个功能。彼此需要等到对方任务完成,再执行自己的任务。而整个任务过程可能有好几个流程,而某一时刻只可能有一个流程在执行,不会同时执行。

你可能感兴趣的:(unity)