assert(exp)
error("error message text")
pcall安全调用
协同程序
lua没有真正的多线程,都是使用协同程序也实现的多线程
lua是非对称式协同程序(semi-coroutine),它提供两个函数来处理执行权
任一时刻只能有一个协同程序在执行
只能自己挂起自己才会停止工作,无法从外部停止其工作
与生产者消费者模型一样互斥协同
所有协同程序的函数放在coroutine的table里
co = coroutine.create(function() print("wangning") end)
assert(type(co)=="thread")
create的参数就是协同程序执行的内容,返回一个thread类型的变量
4种状态:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)
刚创建的协同程序处于挂起状态,可以用status检查状态
assert(coroutine.status(co)=="suspended")
coroutine.resume(co)用于启动或再次启动协同程序,将状态改为running
当协同程序执行完成任务函数后处于dead状态
在任务函数中使用coroutine.yield()可以挂起协同程序
然后调用coroutine.resume()再次启动已挂起协同程序
如果协同程序已经处于dead状态时,resume会返回false失败
当协同程序A唤醒另一个协同程序B时,A将停止执行,换做B执行
这时A的状态为正常状态normal
可以使用resume和yield来交换数据
第一次调用resume的额外参数(第二个以后的参数),都将视为协同程序任务函数的参数传入
之后都将成为yield的返回值
resume的第一个返回值表示成功失败,第二个以后的值都是yield的传入参数
当协同程序的任务函数执行完成后,函数的返回值会成为resume的额外返回值
co = coroutine.create(function(a,b,c)
print(a,b,c)
print(coroutine.yield(4,5,6))
return 10
end)
res, a,b,c = coroutine.resume(co,1,2,3) --> 1 2 3
print(res,a,b,c) --> true 4 5 6
res, d = coroutine.resume(co, 7,8,9) --> 7 8 9
print(res, d) --> true 10
print(coroutine.resume(co)) --> false cannot resume dead coroutine
可以使用一个协同程序负责主任务循环,判断其它协同程序状态,有闲置的就使其执行,实现多线程功能