API: wingman.task
异步任务模块,提供任务提交与生命周期管理功能,支持重试、超时等特性。
模块概述
task 模块提供任务管理功能:
- 提交任务 - 提交任务执行(默认在调用线程同步执行,
async: true时后台线程执行) - 状态查询 - 获取任务状态
- 等待完成 - 等待任务执行完成
- 获取结果 - 获取任务执行结果
- 取消任务 - 取消正在执行的任务
- 暂停 / 恢复 - 协作式暂停执行中的任务,恢复后继续
- 重试任务 - 重试失败的任务
提交任务
submit(work, options?) / submit(work, options?)
说明:提交一个任务。
函数签名:
python
submit(work: Callable, options: dict = None) -> strlua
submit(work: function, options: table = nil) -> string参数:
work- 工作函数,接收上下文对象。默认async: false,在调用线程同步执行;options.async = true时才在后台线程执行(脚本回调不支持跨线程,后台任务的结果/事件经内部线程转投)options- 可选配置async/async- 是否后台线程执行,默认false(同步)timeoutMs/timeoutMs- 超时时间(毫秒),默认 30000maxRetries/maxRetries- 最大重试次数,默认 0backoffMs/backoffMs- 重试退避基数(毫秒),默认 500backoffFactor/backoffFactor- 退避因子,默认 2.0metadata/metadata- 元数据(任意对象)
返回:
- 任务 ID
python
from wingman import task
# 提交任务
def my_work(ctx):
# 执行一些耗时操作
return {"result": 42}
task_id = task.submit(my_work, {
"timeoutMs": 5000,
"retry": {"max": 3, "backoffMs": 500}
})获取任务状态
status(task_id) / status(taskId)
说明:获取任务状态。
函数签名:
python
status(task_id: str) -> strlua
status(taskId: string) -> string参数:
task_id/taskId- 任务 ID
返回:
- 状态字符串:
"pending","running","paused","succeeded","failed","canceled","timeout"
python
from wingman import task
# 检查状态
status = task.status(task_id)
print(f"任务状态: {status}")等待任务完成
wait(task_id, timeout_ms?) / wait(taskId, timeoutMs?)
说明:等待任务完成。
函数签名:
python
wait(task_id: str, timeout_ms: int = 30000) -> boollua
wait(taskId: string, timeoutMs: number = 30000) -> boolean参数:
task_id/taskId- 任务 IDtimeout_ms/timeoutMs- 可选,等待超时(毫秒),默认 30000
返回:
- 是否在超时前完成
python
from wingman import task
# 等待完成
if task.wait(task_id, 10000):
result = task.result(task_id)
print(f"任务完成: {result}")
else:
error = task.error(task_id)
print(f"任务失败: {error}")获取任务结果
result(task_id) / result(taskId)
说明:获取任务结果。
函数签名:
python
result(task_id: str) -> Anylua
result(taskId: string) -> any参数:
task_id/taskId- 任务 ID
返回:
- Python: 任务返回值,如果任务失败或未完成返回
None - Lua: 任务返回值,如果任务失败或未完成返回
nil
获取错误信息
error(task_id) / error(taskId)
说明:获取任务错误信息。
函数签名:
python
error(task_id: str) -> strlua
error(taskId: string) -> string参数:
task_id/taskId- 任务 ID
返回:
- 错误信息字符串,无错误返回空字符串
取消任务
cancel(task_id) / cancel(taskId)
说明:取消任务。
函数签名:
python
cancel(task_id: str) -> boollua
cancel(taskId: string) -> boolean参数:
task_id/taskId- 任务 ID
返回:
- 是否成功
python
from wingman import task
# 取消任务
task.cancel(task_id)暂停 / 恢复任务
pause(task_id) / pause(taskId)
说明:暂停任务。协作式语义——无法挂起正在执行的工作函数本身,暂停在 生命周期检查点生效:开工前驻留不执行、工作完成后结果扣住不落账、重试间隙 不进入下一次尝试;超时时钟在暂停期间停走。pending / running 之外的 状态(含不存在的任务)返回 false。
函数签名:
python
pause(task_id: str) -> boollua
pause(taskId: string) -> boolean参数:
task_id/taskId- 任务 ID
返回:
- 是否成功进入暂停(任务不存在或非可暂停状态返回
false)
resume(task_id) / resume(taskId)
说明:恢复暂停中的任务,放行全部驻留检查点(开工、结果落账、重试)。 仅 paused 状态返回 true,其他状态返回 false。
函数签名:
python
resume(task_id: str) -> boollua
resume(taskId: string) -> boolean参数:
task_id/taskId- 任务 ID
返回:
- 是否成功恢复(任务不存在或不在暂停状态返回
false)
python
from wingman import task
# 暂停执行中的任务
task.pause(task_id)
# 恢复执行
task.resume(task_id)重试任务
retry(task_id, options?) / retry(taskId, options?)
说明:重试失败的任务。
函数签名:
python
retry(task_id: str, options: dict = None) -> boollua
retry(taskId: string, options: table = nil) -> boolean参数:
task_id/taskId- 任务 IDoptions- 可选重试配置maxRetries/maxRetries- 最大重试次数backoffMs/backoffMs- 重试退避基数
返回:
- 是否成功发起重试
python
from wingman import task
# 重试失败的任务
task.retry(task_id, {"maxRetries": 5, "backoffMs": 1000})可用接口
| Python 函数 | Lua 函数 | 说明 | 参数 |
|---|---|---|---|
submit(work, options?) | submit(work, options?) | 提交任务 | work: 工作函数 options: 配置(可选) 返回: 任务ID |
cancel(taskId) | cancel(taskId) | 取消任务 | taskId: 任务ID 返回: 是否成功 |
pause(taskId) | pause(taskId) | 暂停任务(协作式) | taskId: 任务ID 返回: 是否进入暂停 |
resume(taskId) | resume(taskId) | 恢复暂停的任务 | taskId: 任务ID 返回: 是否恢复 |
status(taskId) | status(taskId) | 获取状态 | taskId: 任务ID 返回: 状态字符串 |
wait(taskId, timeoutMs?) | wait(taskId, timeoutMs?) | 等待完成 | taskId: 任务ID timeoutMs: 等待超时(默认30000) 返回: 是否完成 |
result(taskId) | result(taskId) | 获取结果 | taskId: 任务ID 返回: 任务结果 |
error(taskId) | error(taskId) | 获取错误 | taskId: 任务ID 返回: 错误信息 |
retry(taskId, options?) | retry(taskId, options?) | 重试任务 | taskId: 任务ID options: 重试配置(可选) 返回: 是否成功 |
生命周期事件
任务生命周期会触发以下事件。所有事件的载荷统一为 taskId, status, metadata 三个字段(不含 error——失败原因不随事件携带,需用 task.error(taskId) 查询):
| 事件名 | 说明 | 载荷字段 |
|---|---|---|
task.submitted | 任务已提交 | taskId, status, metadata |
task.started | 任务开始执行 | taskId, status, metadata |
task.paused | 任务已暂停 | taskId, status, metadata |
task.resumed | 任务已恢复 | taskId, status, metadata |
task.succeeded | 任务成功 | taskId, status, metadata |
task.failed | 任务失败 | taskId, status, metadata |
task.canceled | 任务已取消 | taskId, status, metadata |
task.timeout | 任务超时 | taskId, status, metadata |
task.error | 任务入队被拒(async: true 且回调非线程安全时发出) | error |
python
from wingman import event
event.on("task.submitted", lambda e: print(f"任务提交: {e['payload']['taskId']}"))
event.on("task.started", lambda e: print("任务开始"))
event.on("task.paused", lambda e: print("任务暂停"))
event.on("task.resumed", lambda e: print("任务恢复"))
event.on("task.succeeded", lambda e: print("任务成功"))
event.on("task.failed", lambda e: print("任务失败,用 task.error(task_id) 查原因"))
event.on("task.canceled", lambda e: print("任务取消"))
event.on("task.timeout", lambda e: print("任务超时"))
event.on("task.error", lambda e: print(f"任务错误: {e['payload']['error']}"))