简介
lua语言本身并不支持像C语言一样的线程操作。因此,如果要让lua脚本同时干多个独立的任务,就要通过协程(coroutine)模拟线程操作。只不过,lua的协程并不是由操作系统负责调度,而是由程序编写者自己通过lua api显示调度。
常用API
- coroutine.create (f)
使用函数 f 作为参数,创建一个协程,并返回协程对象。 - coroutine.resume (co [, val1, …])
显式调度协程 co 运行,并传入参数val1,…。返回值为协程状态和其它可选的返回值。 - coroutine.yield (…)
显式挂起当前协程,同时yield参数将作为resume返回值返回给调度者。 - coroutine.status (co)
返回协程 co 的状态,状态包括:running normal suspended dead 4种。
小例子
local thread_num = 20
local co = {}
function threadfunc(param)
print("thread " .. param .. " begin")
for i=1,5 do
coroutine.yield()
print("thread " .. param .. " do something")
end
end
for i=1, 20 do
co[i] = coroutine.create(threadfunc)
coroutine.resume(co[i], i) -- start the coroutine
end
while true do
local deadnum = 0
for i=1, thread_num do
repeat
local stat = coroutine.status(co[i])
if 'dead' == stat then
deadnum = deadnum + 1
break
elseif 'suspended' == stat then
coroutine.resume(co[i], i)
end
until true
end
if deadnum == thread_num then
print('all coroutines dead, exit')
os.exit(0)
end
end
运行结果
thread 1 begin
thread 2 begin
thread 3 begin
thread 4 begin
thread 5 begin
thread 6 begin
thread 7 begin
thread 8 begin
thread 9 begin
thread 10 begin
thread 11 begin
thread 12 begin
thread 13 begin
thread 14 begin
thread 15 begin
thread 16 begin
thread 17 begin
thread 18 begin
thread 19 begin
thread 20 begin
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
all coroutines dead, exit