本章介绍callx()函数的使用。
描述:
向分机序列分配作业执行脚本,返回每个作业的返回值构成的序列。
语法:
callx(spl,…;hs;rdfx)
备注:
向分机序列hs分配作业执行脚本.dfx/.splx,继承任务空间;返回每个作业的返回值构成的序列。…为传递给.dfx/.splx的参数值。
作业非正常结束则将重新分配(避开已分配过分机),如果找不到可用分机则任务失败,作业分配到不可用分机时被认为非正常结束,缺省将依次分配,即第i个作业分配到hs.m@r(i)上,分配到每个分机都达到最大作业数后则暂停,等某分机返回一个作业后再继续分配,直接全部分配完成
rdfx是两个参数的脚本,用于reduce动作,可省略。其参数分别是当前累积值和当前返回值,rdfx返回值将作为新的累积值,初始累积值为null;有rdfx时,返回值将是每个分机的返回值构成的序列,按hs的次序。
参数:
spl |
脚本文件.dfx/.splx,可设置为绝对路径或相对路径。相对路径为工具->选项->【环境】菜单下的寻址路径。 |
… |
传递给.dfx/.splx的参数值。该参数格式一般为序列,需要给.dfx/.splx传递几个参数,即有几个序列。在并行计算时,将按照该参数的序列长度将计算任务拆分为多个子任务,将序列的每一个成员,作为.dfx/.splx的参数值传递到各自的子任务中。 |
hs |
服务器序列,其中每个服务器的描述均为一个字符串,格式为"地址:端口号",如"192.168.0.86:4001"。 hs中IP省略表示当前物理机上的其他进程,IP和端口同时省略即":"表示当前进程。 |
rdfx |
带有两个参数的dfx脚本,用于reduce动作,可省略。 |
选项:
@a |
随机分配。 |
@l |
只有一个作业也分配给所有可用分机,任何一个就算完成,中断其它任务。 |
示例:
test.dfx为分机部署文件,分机序列为["192.168.31.165:8281","192.168.31.39:8281"]:
(一) 单个参数
test.dfx文件内容如下:
|
A |
B |
1 |
=connect("demo").query("select * from SCORES where SUBJECT=?",arg1) |
|
2 |
return A1 |
return A1.(SCORE) |
reduce.dfx文件内容如下:
|
A |
|
1 |
=a|b |
a,b 分别为reduce.dfx中的参数,a表示当前累计值,b表示当前返回值。 |
|
A |
|
1 |
=["192.168.31.165:8281","192.168.31.39:8281"] |
分机序列。 |
2 |
=callx("test.dfx",["English","Math","PE"];A1) |
按次序分配作业,返回每个作业的返回值构成的序列:
|
3 |
=callx("test.dfx",["English","Math","PE"];A1;"reduce.dfx") |
按次序分配作业,执行reduce动作,返回每个分机的返回值构成的序列:
|
4 |
=callx@a("test.dfx",["English","Math","PE"];A1;"reduce.dfx") |
使用@a选项,随机分配作业:
|
5 |
=callx@1("test.dfx",["English","Math","PE"];A1) |
使用@1选项,任何一个作业完成,中断其他任务:
|
6 |
=callx("test.dfx",["English","Math","PE"];":8281") |
在本机的8281端口中执行脚本。 |
7 |
=callx("test.dfx",["English","Math","PE"];":") |
在当前进程中执行脚本。 |
(二)多个参数
|
A |
1 |
=connect("demo") |
2 |
=A1.query("select * from EMPLOYEE where EID in (?) and GENDER=?",arg1,arg2) |
3 |
=A1.close() |
4 |
return A2 |
|
A |
|
1 |
=["192.168.31.165:8281","192.168.31.39:8281"] |
分机序列。 |
2 |
=callx("test.dfx",[1,20,6,14,5],"F";["192.168.31.165:8281"]) |
向一台分机传递两个参数,参数[6,F]查询数据为空:
|
3 |
=callx("test.dfx",[1,20,6,14,5],"F";A1;"reduce.dfx") |
向多台分机传递两个参数,依次分配作业,即[1,F]、[6,F]、[5,F]分配给分机"192.168.31.165:8281",[20,F]、[14,F]分配给分机"192.168.31.39:8281"。
|
4 |
=callx("test.dfx",[[1,20,6,14,5],[22,33,44]],"F";A1) |
向多台分机传递多个参数,当接收的同一参数值相同时可用单值形式传递,即[ [1,20,6,14,5],F ] 传递给分机"192.168.31.165:8281",[[22,33,44],F]传递给分机"192.168.31.39:8281"。 |
5 |
=callx("test.dfx",[[1,20,6,14,5],[22,33,44]],["F","M"];A1) |
多个节点机接收到的同一参数值不同时以序列形式传递,即[ [1,20,6,14,5],F ] 传递给分机"192.168.31.165:8281",[[22,33,44],M]传递给分机"192.168.31.39:8281"。 |