数速云 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 之间通过网络传递信息,存在一定的延迟,因此超时秒数不宜过小。