跳转至

task_plugin

TSL语言的跨平台实现的任务并发调度插件。

安装

(已集成到mytsl发行版中)

动态库文件:Windows: task_plugin.dll 或者 Linux: libtask_plugin.so。

把相关的动态库文件拷贝到执行服务器或者TSL目录的plugin目录。

(如果需要下载兼容正式版的Windows版本的动态库文件请访问这里)。

使用指南

提供的TSL函数:

taskgroup_create

taskgroup_create(threads): 创建任务组。

  • 参数列表

    参数 描述
    threads 线程数
  • 返回值

    任务组句柄。

taskgroup_destroy

taskgroup_destroy(tg): 释放任务组。

  • 参数列表

    参数 描述
    tg 任务组句柄
  • 返回值

    1。

taskgroup_run

taskgroup_run(tg, funcname, args...): 发起任务执行。

  • 参数列表

    参数 描述
    tg 任务组句柄
    funcname 函数名或者匿名函数
    args 参数
  • 返回值

    数组类型,如果发生错误:

    下标
    0 错误代码
    1 错误信息

    没有错误:

    下标
    0 0
    1 任务句柄
  • 例子

taskgroup_run(tg, "func_no_args");
taskgroup_run(tg, "func_1_arg", 1);
taskgroup_run(tg, "func_2_args", 1, 2);

// 也支持匿名函数,这个比较方便
taskgroup_run(tg, (x) => x+1, 1);

taskgroup_cancel

taskgroup_cancel(tg, handle, [timeout]): 取消任务执行。

  • 参数列表

    参数 描述
    tg 任务组句柄
    handle 任务句柄
    timeout 超时设置,可选参数,整数类型,毫秒精度。缺省不超时。
  • 返回值

    数组类型,如果发生错误:

    下标
    0 错误代码
    1 错误信息

    没有错误:

    下标
    0 0
    1 1 成功 2 超时
  • 例子

[err, h] := taskgroup_run(tg, "func");
[err, s] := taskgroup_cancel(tg, h);
println("任务取消结果:{}{}", err, s);

taskgroup_list

taskgroup_list(tg): 列出所有任务。

  • 参数列表

    参数 描述
    tg 任务组句柄
  • 返回值

    以任务句柄为Key,任务状态为value的字符串对数组类型。 任务状态包含:

    描述
    wait 等待调度运行
    run 正在运行
    done 已完成
    canceling 取消中
    canceled 已取消
  • 例子

println("task state: {}", taskgroup_list(tg));
// 打印类似这样:task state: array("task#0x1926bebc040":"run","task#0x1926bebc220":"run","task#0x1926e319a90":"run","task#0x1926e31a030":"run")

taskgroup_wait_all

`taskgroup_wait_all(tg) : 等待任务组所有任务完成。

  • 参数列表

    参数 描述
    tg 任务组句柄
  • 返回值

    数组类型,如果发生错误:

    下标
    0 错误代码
    1 错误信息

    没有错误:

    下标
    0 0
    1 结果数组
  • 例子

tg := taskgroup_create(5);
taskgroup_run(tg, "func0");       // func0 return 0
taskgroup_run(tg, "func1", 1);    // func1 return 1
taskgroup_run(tg, "func2", 1, 2); // func2 return array(1,2)
res := taskgroup_wait_all(tg);
println("res={}", res);
taskgroup_destroy(tg);

打印:
res=array(0,(0,1,(1,2)))        

taskgroup_wait_any

taskgroup_wait_any(tg, [timeout]): 等待任务组中某个任务完成。

  • 参数列表

    参数 描述
    tg 任务组句柄
    timeout 超时,毫秒精度,可选参数,默认是0不超时
  • 返回值

    数组类型,如果发生错误:

    下标
    0 错误代码
    1 错误信息

    其中错误代码 -1 表示超时, -2 没有任务。 没有错误:

    下标
    0 0
    1 结果
  • 例子

tg := taskgroup_create(5);
taskgroup_run(tg, "func0");       // func0 return 0
taskgroup_run(tg, "func1", 1);    // func1 return 1
taskgroup_run(tg, "func2", 1, 2); // func2 return array(1,2)
println("any:{}", taskgroup_wait_any(tg));
println("any:{}", taskgroup_wait_any(tg));
println("any:{}", taskgroup_wait_any(tg));
taskgroup_destroy(tg);

打印:
any:array(0,0)
any:array(0,(1,2))
any:array(0,1)   

范例

并发性能优化

// 需要花费1秒的任务
hardwork := (n) => begin
    sleep(1000);
    return fmt("work {} done.", n);
end;

// 5个顺序做需要1*5=5秒
mtic;
hardwork(1);
hardwork(2);
hardwork(3);
hardwork(4);
hardwork(5);
t1 := mtoc;

tg := taskgroup_create(5);

// 5个并发做只需要1秒
mtic;
taskgroup_run(tg, hardwork, 1);
taskgroup_run(tg, hardwork, 2);
taskgroup_run(tg, hardwork, 3);
taskgroup_run(tg, hardwork, 4);
taskgroup_run(tg, hardwork, 5);
res := taskgroup_wait_all(tg);
t2 := mtoc;
println("res={}", res);
println("t1={},t2={}, t1/t2={}", t1, t2, t1/t2);

(*
打印:
res=array(0,("work 1 done.","work 2 done.","work 3 done.","work 4 done.","work 5 done."))
t1=5.034775,t2=1.0127435, t1/t2=4.971421687722508
*)

TODO

如何传递大数组?

目前参数在传递时是复制的,如果有任务组是对大数组进行操作,可能不希望复制,这时需要一个方式来传递。 例如这样?

taskgroup_run(tg, "handle_big_array", @const_ref(big_array), ....);

取消任务