协作式多任务
Lua 的协程(coroutine)可作为并发任务使用。通过 async_task 创建协程任务后,任务并不会立即执行,只有将任务传入 wait_all 或 wait_any 时才会开始运行。
创建协程任务 3.0
创建一个协程任务。在调用 wait_all 或 wait_any 前,任务不会执行。
- 函数名:lua模块的函数
async_task - 参数:
- fun: [function] 待运行的函数
- args: [any] 透传给函数
fun的参数,可省略
- 返回:[thread] 协程任务
兼容说明
等效于以下写法:
task = coroutine.create(function() return fun(args) end)
示例程序
task = async_task(function(a, b)
print(a + b)
end, 1, 2)
等待全部任务完成 3.0
等待全部协程任务完成,并返回各任务的返回值。若任一任务抛出错误,该错误会向上抛出。
- 函数名:lua模块的函数
wait_all - 参数:
- tasks: [thread] 协程任务,可传入多个
- 返回:[any] 各协程任务的返回值,按传入顺序依次返回
示例程序
function 运动(param)
print(param, '开始运行')
movej({j1=0, j2=0, j3=0, j4=0, j5=0, j6=0}, 0, 0, 1, 0)
sync() -- 等待运动完成
return "运动完成"
end
function 夹爪()
wait(1000)
set_claw(0, 100)
return "夹爪完成"
end
ret1, ret2 = wait_all(async_task(运动, '线程一'), async_task(夹爪))
print("运动 任务返回值: ", ret1)
print("夹爪 任务返回值: ", ret2)
等待任一任务完成 3.0
等待任意一个协程任务完成,返回最先完成任务的返回值及其在参数列表中的序号。
- 函数名:lua模块的函数
wait_any - 参数:
- tasks: [thread] 协程任务,可传入多个
- 返回:
ret, index。ret为已完成任务的返回值,没有任务时返回nil;index为已完成任务在参数列表中的序号(从 1 开始),没有任务时返回-1
示例程序
local task_timeout = async_task(wait, 1000) -- 创建等待超时的任务
ret, index = wait_any(async_task(运动, '线程二'), task_timeout)
if index == 2 then -- task_timeout 先执行完成
print("超时")
else -- 运动先执行完成
print("运动 任务返回值: ", ret)
end
查询协程任务状态 3.0
推进协程任务执行,并返回任务状态。
- 函数名:lua模块的函数
async_result - 参数:
- task: [thread] 协程任务
- 返回:
status, result。status为任务状态:"running":运行中;"finish":已完成,此时result为任务的返回值;"dead":任务执行出错已终止
示例程序
task = async_task(function() return "ok" end)
wait_all(task)
status, result = async_result(task)
print(status, result) -- finish ok
