跳转到内容

async.runjobs

并发执行任务,自动处理依赖关系。支持从函数、jobpool 或 jobgraph 运行任务。

提示

使用此模块需要先导入:import("async.runjobs")

runjobs

并发执行任务。

函数原型

API

lua
runjobs(name: <string>, jobs: <function|jobpool|jobgraph>, options?: <table>)

参数

参数描述
name任务名称,用于协程命名和分组
jobs任务函数、jobpool 或 jobgraph 实例
options可选的配置表

选项

选项类型默认值描述
totalnumber自动总任务数(jobs 是函数时必需)
comaxnumber4最大并发数
timeoutnumber500定时器回调超时(毫秒,需 < 60000)
on_timerfunctionnil定时器回调:function(running_jobs_indices)
waiting_indicatorboolean|tablenil启用等待指示器
progressbooleannil已废弃:使用 waiting_indicator 代替
progress_factornumber1.0进度计算因子
progress_refreshbooleannil启用多行进度刷新(v3.0.5)
on_exitfunctionnil退出回调:function(abort_errors)
curdirstringnil任务执行的工作目录
isolatebooleannil隔离协程环境
remote_onlybooleanfalse仅在远程运行
distccobjectnildistcc 客户端,用于分布式构建

任务函数

jobs 是函数时,每个任务会调用该函数:

lua
function(job_index: <number>, total: <number>, opt: <table>)

opt 表包含:

  • progress: 进度对象,提供 current()total()percent() 方法

示例

函数方式:

lua
import("async.runjobs")

runjobs("test", function (index, total, opt)
    print("任务 %d/%d, 进度: %s", index, total, opt.progress)
    os.sleep(1000)
end, {
    total = 100,
    comax = 6,
    timeout = 1000,
    on_timer = function (indices)
        print("运行中: %s", table.concat(indices, ","))
    end
})

等待指示器:

lua
import("async.runjobs")

-- 简单指示器
runjobs("test", function ()
    os.sleep(10000)
end, {
    waiting_indicator = true
})

-- 自定义指示器
runjobs("test", function ()
    os.sleep(10000)
end, {
    waiting_indicator = {
        chars = {'/', '-', '\\', '|'}
    }
})

多行进度刷新:

lua
import("async.runjobs")

runjobs("test", function ()
    os.sleep(10000)
end, {
    waiting_indicator = true,
    progress_refresh = true
})

使用 jobgraph:

lua
import("core.base.scheduler")
import("async.jobgraph")
import("async.runjobs")

function jobfunc(index, total, opt)
    print("%s: 任务 (%d/%d)", scheduler.co_running(), index, total)
    os.sleep(1000)
end

local jobs = jobgraph.new()
jobs:add("job/root", jobfunc)
for i = 1, 3 do
    jobs:add("job/" .. i, jobfunc)
    for j = 1, 5 do
        jobs:add("job/" .. i .. "/" .. j, jobfunc)
        jobs:add_orders("job/" .. i .. "/" .. j, "job/" .. i, "job/root")
    end
end

runjobs("test", jobs, {
    comax = 4,
    timeout = 1000,
    on_timer = function (indices)
        print("运行中: %s", table.concat(indices, ","))
    end
})

使用 jobpool:

lua
import("async.jobpool")
import("async.runjobs")

local jobs = jobpool.new()
local root = jobs:addjob("job/root", function (index, total, opt)
    print(index, total, opt.progress)
end)
for i = 1, 3 do
    jobs:addjob("job/" .. i, function (index, total, opt)
        print(index, total, opt.progress)
    end, {rootjob = root})
end

runjobs("test", jobs, {
    comax = 6,
    timeout = 1000
})

分布式构建:

lua
import("async.runjobs")

local distcc_client = distcc_build_client.singleton()
runjobs("test", jobs, {
    comax = 6,
    distcc = distcc_client
})

退出回调:

lua
import("async.runjobs")

runjobs("test", function (index, total, opt)
    -- 任务逻辑
end, {
    total = 100,
    on_exit = function (abort_errors)
        if abort_errors then
            print("中止:", abort_errors)
        end
    end
})

设置工作目录:

lua
import("async.runjobs")

runjobs("test", function (index, total, opt)
    print(os.getcwd())  -- 输出 /tmp/build
end, {
    total = 10,
    curdir = "/tmp/build"
})

相关链接:async.jobgraph