在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)的主要内容,如果未能解决你的问题,请参考以下文章

在AngularJS中实现一个延迟加载的Directive

如何在 UITableView 中实现类似 UIImageView 的延迟加载

Hibernate延迟加载Lazy

Hibernate延迟加载Lazy

linux 中实现延迟45分钟后执行命令,写了一段c程序,实现延迟,接下来,该如何执行命令呢,也就是shell

Hibernate延迟加载Lazy