Lua协同程序与线程比较相似,拥有独立的堆栈,独立的局部变量,独立的智力指针,同时又与其他协同程序共享全局变量和其它大部分东西。
协同程序方法(coroutine)
方法 | 描述 |
---|---|
coroutine.create() | 创建coroutine,返回coroutine,参数是一个函数,使用此方法创建协程,需要使用coroutine.resume()唤醒函数调用 |
coroutine.resume() | 此方法与create配合使用,主要是用来唤醒函数调用 |
coroutine.yield() | 挂起协同程序 |
coroutine.status() | 查看coroutine的状态(coroutine的状态有三种:dead,suspend,running) |
coroutine.wrap() | 创建coroutine,返回一个函数,调用函数,就进入coroutine |
coroutine.running() | 返回正在跑的coroutine,一个coroutine就是一个线程,当使用run,就是返回一个corouting线程号 |
coroutine.create() 与coroutine.resume():
co = coroutine.create(
function(i)
print(i)
end
)
--唤醒函数调用
coroutine.resume(co,1)
输出
1
>Exit code: 0
coroutine.status():
--接上一段程序
print(coroutine.status(co))
输出:
coroutine.resume(co,1)
coroutine.wrap():
--coroutine.wrap 返回一个函数,调用函数,就进入coroutine
co = coroutine.wrap(
function(i)
print(i);
end
)
co(1)
结果:
1
>Exit code: 0
注意与coroutine.create()创建协同,执行协同的方式不同。
coroutine.yield():
co2 = coroutine.create(
function()
for i=1,10 do
print(i)
if i==3 then
print(coroutine.status(co2))
print(coroutine.running())
end
coroutine.yield()
end
end
)
coroutine.resume(co2)
coroutine.resume(co2)
coroutine.resume(co2)
结果 :
1
2
3
>Exit code: 0
coroutine.running():
print(coroutine.running())
结果:
thread: 02C483D8
coroutine.running()就可以看出来,coroutine在底层实现就是一个线程。
当create一个coroutine的时候就是在新线程中注册了一个事件。使用resume触发事件的时候,create的coroutine函数就被函数执行,当遇到yield的时候就代表挂起当前线程,等待再次resume事件触发。