在Shell中实现延迟加载(Lazy Loading)
Posted bluishglc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Shell中实现延迟加载(Lazy Loading)相关的知识,希望对你有一定的参考价值。
很多高级编程语言都内置支持Lazy Loading(延迟加载)特性,因为这一特性具有普遍的适用场景,遗憾的是在Shell中并不具备这一特性。考虑这样一种场景:在一段Shell脚本中存在一个变量A,其值是通过一个命令行动态获取的(例如CLI客户端和服务器/API交互之后方可得到),如果每次获取变量A都通过CLI发起一次远程请求显然不够明智,脚本执行效率也会变慢。所以可以考虑让变量A成为全局变量,在初次调用时发起一次远程请求获得变量A的值并赋予A即可。但是,脚本中会大量引用变量A,且脚本封装了大量功能单一的函数,调用顺序和时机都会因参数不同而动态调整,所以无法静态确定变量A的初始化时机。此时,使用延迟加载就可以完美地规避变量A的初始化时机问题。
以https://github.com/bluishglc/ranger-emr-cli-installer/blob/master/bin/emr.sh
中的getEmrMasterNodes
函数为例:
getEmrMasterNodes()
if [[ "$EMR_MASTER_NODES[*]" = "" ]]; then
masterInstanceGroupId=$(getMasterInstanceGroupId)
EMR_MASTER_NODES=($(getNodes "$masterInstanceGroupId"))
fi
echo "$EMR_MASTER_NODES[@]"
这是一个非常好的延迟加载实现,EMR_MASTER_NODES
是一个全局变量,但是脚本中除了该函数之外,不会有任何地方直接读取它,而是通过这个封装的函数getEmrMasterNodes
来读取EMR Master Nodes,因为getEmrMasterNodes
函数封装一个Lazy Loading的逻辑,确保EMR_MASTER_NODES只会被加载一次。在所有需要使用EMR Master Nodes的地方,统一使用$(getEmrMasterNodes)
方式来获取,例如这样:
for masterNode in $(getEmrMasterNodes); do
....
done
以上就是在Shell中实现延迟加载的一个非常生动的场景和参考!
以上是关于在Shell中实现延迟加载(Lazy Loading)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UITableView 中实现类似 UIImageView 的延迟加载