最近若干群友在大群里反馈,说他同一片数据,同样的计算操作,有时得出A值,有时得出B值。问是不是DDB的计算有bug?
一看代码,好多他们的脚本在文件的开头,没有执行清理变量和缓存的动作,那这样完全就没有办法保证中间变量的值。
编程里面有个很重要的概念,叫“可重入”和“不可重入”。
就是说,如果你的一段代码,每次走到这同一个地方,呈现的是不一样的行为,或者得到不一样的值,那就是“不可重入”。如果代码每次走到这个地方,变量值是固定的,变量空间没有污染,这就是“可重入”。
类成员函数,因为要使用类里面的成员变量来记录实例的状态,函数返回什么样的值取决于该实例的状态,所以类成员函数通常都是不重入的。
只要不是类成员的普通函数,都应该是“可重入的”。
DDB目前(指当下的版本2.00.5和1.30.17)暂不支持类,所以在DDB的每个启动脚本的开头,都应该清除之前变量和定义的值。保证后面的业务代码每次走到同一个地方,得到同样的值。
脚本开头的清理代码(本段代码不涉及共享表和流处理相关变量,涉及流处理的情况,另文解说):
login("admin","******");//这里根据你的服务器配置来填写
clearAllCache();//清理之前的缓存
undef(all);//注销之前的变量
go;//必须执行go,脚本才会立即执行以上动作,保证下游的变量空间干净
另外,如果你连接的这个DDB节点,目前有其他job或者用户正在运行,你的清理动作会把其他人和job的变量清除掉,执行前请确认没有其他人在运行。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!