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