对于协同程序在真正应用中怎么使用还不太明白,先写下它的使用方法供日后研究吧。直接上代码:
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
有点明白为什么叫协同程序了,就是需要两个程序合作交互完成某个功能。彼此需要等到对方任务完成,再执行自己的任务。而整个任务过程可能有好几个流程,而某一时刻只可能有一个流程在执行,不会同时执行。