数速云 SSC 全局变量和锁
全局变量
在 SSC 环境中,有时需要在多个 QVM 上的计算任务(QVM 脚本)之间共享信息,这时可以使用 SSC 全局变量(以下简称全局变量)。全局变量由 QVS 管理,通过 QVS 申请到的每个 QVM 上运行的脚本都可以共享全局变量。
全局变量由 Qenv 函数赋值:Qenv("gv1",1) #gv1 是变量名
获取全局变量也用 Qenv 函数:Qenv("gv1")
与普通的 SPL 全局变量不同,访问 SSC 全局变量时,相关数据会在 QVS 和 QVM 之间传输,由于网络传输的性能远低于内存访问,因此不适合保存大量数据,只适合存放状态 / 参数等少量数据。
比如:某 SSC 应用使用配置文件存储环境变量,含有应用的根目录,该应用涉及的数据文件的路径是动态的,要用根目录拼出来。使用全局变量可以方便地实现该目标。
配置文件(S3 上的 json):[{"app_root":"bucket1114/root1","datetime_format":"……"}]
在应用的初始化阶段或动态切换根目录时,将应用的根目录设置为全局变量:
A |
B |
|
1 |
=Qfile("bucket1114/app.json") |
json 文件 |
2 |
=json(A1.read()) |
解析 |
3 |
=Qenv("app_root",A2.app_root) |
全局变量赋值 |
应用进行计算时,可以使用全局变量拼出实际的动态路径,从而访问相应的数据文件。
A |
B |
|
1 |
=realPath=concat(Qenv("app_root","/","sales.txt")) |
全局变量获取 |
2 |
=Qfile(realPath) |
数据文件 |
3 |
=A2.import@t() |
解析 |
4 |
=A3.select(Amount>arg1 && Amount<=arg2) |
计算 |
锁
如果要修改 SSC 全局变量,则其读写时通常需要加锁,否则可能导致修改失效或者读出错误结果。比如我们想统计某个 QVM 脚本的执行次数 m,脚本被同时执行时(假设 2 并发,m 初值 =0),如果不加锁,两个任务里的 m+1 都是 0+1=1,最终结果是 1,显然错误。
使用锁之后,两个任务里的 m+1 会被强制先后执行,先上锁的先执行,0+1=1,前者释放资源后后者再执行,此时 m=1,所以 m+1=2,得到的结果正确。
QVM 脚本:
A |
B |
B |
|
1 |
if (Qlock("lock1"),2) |
上锁,锁名是 lock1 |
|
2 |
>Qenv("m",Qenv("m”)+1) |
访问次数加 1 |
|
3 |
=Qlock@u("lock1") |
解锁 |
|
4 |
else |
||
5 |
return "lock failed" |
上锁失败 |
|
6 |
… |
加锁时用函数 Qlock,2 个参数都必填,第一个参数是锁名,第二个参数是超时秒数,上锁成功时返回 true,如果因为其他脚本没有释放锁等原因导致超时,则返回 false,表示上锁失败。解锁时在函数 Qlock 的基础上使用选项 @u。与普通 SPL 锁不同,使用 SSC 锁时会在 QVM 和 QVS 之间通过网络传递信息,存在一定的延迟,因此超时秒数不宜过小。
英文版