Q:网格计算时立马执行结束,没有进行阻塞?
A:2022-10-20 天软服务器进行了升级,数组采用copyonwrite模式,即只读时采用数组引用不再复制数组,写时进行数组复制,该模式大大提升数组统计函数的效率。
同时,对需要依赖对数组进行访问时需要产生数组复制相关功能可能失效。
比如已知可能的冲突是对存贮网格的数组进行复制将无法阻塞,需要采用dupvalue函数进行阻塞。
即:
以前写阻塞方式为 ret:=tmp;的方式,需要变更成ret:=dupvalue(tmp);进行处理,保证对网格结果tmp的复制,进行有保障的阻塞。
例:以前这么写的:
ret:=array();
for i:=0 to 5 do
begin
ret[i]:=#TestFun(xxx); //网格计算
end
r:=array();
//对结果进行访问造成阻塞,以便等待各服务器运行的结果。
for i:=0 to length(ret)-1 do
r[i]:=ret[i];//以前只需要访问即可阻塞
return r;
现在可以改成:
ret:=array();
for i:=0 to 5 do
begin
ret[i]:=#TestFun(xxx); //网格计算
end
r:=array();
//对结果进行访问造成阻塞,以便等待各服务器运行的结果。
for i:=0 to length(ret)-1 do
r[i]:=dupvalue(ret[i]);//现在由于访问不需要复制原数据,所以不能造成阻塞,需要做复制数组这个操作才可
return r;