协作式多任务

Lua 的协程(coroutine)可作为并发任务使用。通过 async_task 创建协程任务后,任务并不会立即执行,只有将任务传入 wait_allwait_any 时才会开始运行。

创建协程任务 3.0

创建一个协程任务。在调用 wait_allwait_any 前,任务不会执行。

  • 函数名:lua模块的函数async_task
  • 参数:
    1. fun: [function] 待运行的函数
    2. 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
  • 参数:
    1. 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
  • 参数:
    1. tasks: [thread] 协程任务,可传入多个
  • 返回:ret, indexret 为已完成任务的返回值,没有任务时返回 nilindex 为已完成任务在参数列表中的序号(从 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
  • 参数:
    1. task: [thread] 协程任务
  • 返回:status, resultstatus 为任务状态:"running":运行中;"finish":已完成,此时 result 为任务的返回值;"dead":任务执行出错已终止

示例程序

task = async_task(function() return "ok" end)
wait_all(task)
status, result = async_result(task)
print(status, result) -- finish ok