lua是一种简单,可扩展,可移植及高效的脚本语言。在嵌入式系统,移动设备,web服务器,游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与c语言或者其他语言。
这里说的是lua语言中的协同程序(coroute),也有人翻译成为协作程序
coroutine就是lua的协同程序
创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用
重启coroutine,和create配合使用
挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果
查看coroutine的状态
注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序
创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复
返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号
<code>co = coroutine.create(</code>
<code> </code><code>function</code><code>(i)</code>
<code> </code><code>print</code><code>(i);</code>
<code> </code><code>end</code>
<code>)</code>
<code>coroutine.resume(co, 1) -- 1</code>
<code>print</code><code>(coroutine.status(co)) -- dead</code>
<code>print</code><code>(</code><code>"----------"</code><code>)</code>
<code>co = coroutine.wrap(</code>
<code>co(1)</code>
<code>co2 = coroutine.create(</code>
<code> </code><code>function</code><code>()</code>
<code> </code><code>for</code> <code>i=1,10</code><code>do</code>
<code> </code><code>print</code><code>(i)</code>
<code> </code><code>if</code> <code>i == 3 then</code>
<code> </code><code>print</code><code>(coroutine.status(co2)) --running</code>
<code> </code><code>print</code><code>(coroutine.running()) --thread:xxxxxx</code>
<code> </code><code>end</code>
<code> </code><code>coroutine.</code><code>yield</code><code>()</code>
<code> </code><code>end</code>
<code>coroutine.resume(co2) --1</code>
<code>coroutine.resume(co2) --2</code>
<code>coroutine.resume(co2) --3</code>
<code>print</code><code>(coroutine.status(co2)) -- suspended</code>
<code>print</code><code>(coroutine.running()) --nil</code>
返回数据:

coroutine.running就可以看出来,coroutine在底层实现就是一个线程。当create一个coroutine的时候就是在新线程中注册了一个事件。当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。
我稍微做了点修改,增加了一下分隔符:
<code>function foo (a)</code>
<code> </code><code>print(</code><code>"foo"</code><code>, a) -- foo 2</code>
<code> </code><code>return</code> <code>coroutine.yield(2 * a) --</code><code>return</code><code>: a , b</code>
<code>end</code>
<code>co = coroutine.create(function (a , b)</code>
<code> </code><code>print(</code><code>"co-body"</code><code>, a, b) -- co-body 1 10</code>
<code> </code><code>local r = foo(a + 1)</code>
<code> </code>
<code> </code><code>print(</code><code>"co-body2"</code><code>, r)</code>
<code> </code><code>local r, s = coroutine.yield(a + b, a - b)</code>
<code> </code><code>print(</code><code>"co-body3"</code><code>, r, s)</code>
<code> </code><code>return</code> <code>b,</code><code>"end"</code>
<code>end)</code>
<code> </code>
<code>print(</code><code>"main"</code><code>, coroutine.resume(co, 1, 10)) --</code><code>true</code><code>, 4</code>
<code>print(</code><code>"------"</code><code>)</code>
<code>print(</code><code>"main"</code><code>, coroutine.resume(co,</code><code>"r"</code><code>)) --</code><code>true</code> <code>11 -9</code>
<code>print(</code><code>"main"</code><code>, coroutine.resume(co,</code><code>"x"</code><code>,</code><code>"y"</code><code>)) --</code><code>true</code> <code>10 end</code>
<code>print(</code><code>"main"</code><code>, coroutine.resume(co,</code><code>"x"</code><code>,</code><code>"y"</code><code>)) --</code><code>false</code> <code>cannot resume dead coroutine</code>
这个程序返回:
很神奇,也很让人看不懂
先理解下下面几点:
resume一定是在主线程的,yield是在子线程(coroutine)的
resume可以带参数
当coroutine是suspend状态的时候,参数是作为coroutine的参数传入的
resume返回值有两种情况
当coroutine是suspend状态的时候,返回是是bool [yield params]
bool是这个resume操作是否成功
yield params是当前coroutine的yield的参数
当coroutine是dead状态的时候,返回值是bool [function return]
先对照上面几条看一个简单的例子:
<code> </code><code>function (a , b)</code>
<code> </code><code>print(</code><code>"params"</code><code>, a, b)</code>
<code> </code><code>return</code> <code>coroutine.yield(3, 3)</code>
<code>coroutine.resume(co, 1, 2);</code>
<code>print(coroutine.resume(co, 4, 5))</code>
理解完上面这个程序,再看看coroutine2的程序,这里把每个输出执行了哪些步骤列出来了:
print("main", coroutine.resume(co, 1, 10)) 执行了:
print("co-body", 1, 10)
print("foo", 2)
coroutine.resume(co, 1, 10) 返回 true, 4 (!!这里的4是yield的参数)
print("main", true, 4)
print("main", coroutine.resume(co, "r")) 执行了:
foo(a) 返回了 "r" (这是由yield返回的)
print("co-body2", "r")
coroutine.resume(co, "r") 返回 true, 11 -9 (!!这里的a和b还是用1和10计算的)
print("main" , true, 11 -9)
print("main", coroutine.resume(co, "x", "y"))执行了:
local r, s = coroutine.yield(a + b, a - b) r和s值为x和y
print("co-body3", "x", "y")
return b, "end" //此时coroutine线程结束,为dead状态
coroutine.resume(co, "x", "y") 返回值为 true 10 end
print("main" , true 10 end)
由于coroutine.resume(co, "x", "y")已经dead了,所以这里返回false