MFA:Module Function Arguments.

首先你要知道Module:Func(Args)和Func(Args)的区别在哪里?

如果对细节感兴趣,可以通过这里了解:http://www.cnblogs.com/zhongwencool/p/erlang_hot_code.html

总之:Erlang函数有local call和external call的区别,Local call 就是在函数在被定义的模块里面被调用,可以直接被调用: Func(Args); External call 就是显式的使用Module:Func(Args)来调用或import别的模块进来的调用.

当同一个模块有2个版本被加载里,所有的local call都可以工作在当前版本状态,但是:external call只能调用到最新的版本!

1.使用Fun的情景:

       1.1 先启动1个shell终端,分别名为test1:

erl -name test1

1.2 test1加载模块mfa_test.erl

-module(mfa_fun).

-export([cal/2,func/0]).

cal(X,Y) ->
X+Y.
func() ->
fun(X,Y) -> cal(X,Y) end.

1.3在shell中输入:

>Func = mfa_fun:func().
#Fun<mfa_fun.1.52492151>
>Func(1,2).
3

2.使用MFA的场景:

改变mfa_test.erl中cal函数并重新加载这个模块:

cal(X,Y) -> X*Y .

1.5 再运行:

>Func(1,2).
3

可以看到这个Func运行的local版本,如果把func改为以下版本:

func() ->
fun(X,Y) -> ?MODULE:cal(X,Y) end.

那么结果是永远调用的最新版本代码,有兴趣可以自己验证下,你会感到好神奇,为什么Func变量是没有变化,但得到的结果却发生了变化。。。


那么我们可以再进一步想一下:

我们经常使用spawn(Func)来创建一个新的进程,如果我们永远不升级还好,如果热升级,会发生什么情况?

这个local call的func,你怎么也改不了它,所以正常情况下最好使用:

spawn(Mod,FuncName,Args)来创建进程,这样不会影响升级。

再进一步,就是进程里面所有存local call都是无法被升级的,最佳实践就是一直用MFA就好!


     选择比努力重要,及时感恩,珍惜生活

[Erlang16]为什么要用MFA代替fun()–>end?的更多相关文章

  1. Enable MFA for a user

    If you are root/admin account, in order to configure a virtual MFA device, you must have physical ac ...

  2. 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)

    最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...

  3. Amazon(iam)IAM用户启用MFA

    1.1 下载MFA软件 我这里选择Google的Authenticator 1.2 进入IAM 搜索IAM,点击进入 1.3 选择需要设置MFA的用户 1.4 选择安全证书 1.5 管理MFA设置 这 ...

  4. 国内版Office365实现MFA的方案(未完)

    现在二十一世纪互联版也可以实现了MFA,现在也就是2017年3月份,支持了PC,但是对移动端应用还是不支持的,请了解. 具体方法如下: 登录国内版Office365(事例为高级商业版 https:// ...

  5. 什么是 MFA?

    Multi-Factor Authentication (MFA) 是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护. 启用 MFA 后,用户登录阿里云网站时,系统将要 ...

  6. twitch游戏直播(【国外】平台)如何绑定二次验证码_虚拟MFA?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 twitch游戏直播([国外]平台)如何绑定二次验证码_虚拟MFA? 二次验证码小程序于谷歌身份验证器APP的优势(更多见官网 ...

  7. SmartMS如何使用二次验证码/虚拟MFA/两步验证/谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 SmartMS如何使用二次验证码/虚拟MFA/两步验证/谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无 ...

  8. Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1 ...

  9. 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优 ...

随机推荐

  1. 第十篇 before_request after_request

    Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下: from flask import Flask app = Flask(__na ...

  2. openLayers 3 之入门

    openLayers 3 之入门 openlayer是web GIS客户端开发提供的javascript类库,也是开源框架,可以加载本地数据进行展示地图 1.下载相关引用的js.css文件 2.类似于 ...

  3. angularjs之ng-option

    ng-options一般有以下用法: 对于数组: label for value in array select as label for value in array label group by  ...

  4. 使用PowerMap生成地图图文

    地区    GDP(亿)广东省    80854江苏省    77388山东省    68024浙江省    47251河南省    40471四川省    32934湖北省    32665河北省  ...

  5. c++可变参数(示例)

    #include "stdafx.h" #include <stdarg.h> // 必须包含的头文件 #define ADD(int_params,...) Add( ...

  6. hbase安装与配置-分布式

    HBASE安装与配置 备注: 1:本文在hadoop的完全分布式基础上部署hbase 2:本文使用的是小博主自己搭建的zookpeer服务,未使用hbase本身的zookpeer服务 本文内容在以下前 ...

  7. Linux实战教学笔记29:MySQL数据库企业级应用实践

    第二十九节 MySQL数据库企业级应用实践 一,概述 1.1 MySQL介绍 MySQL属于传统关系型数据库产品,它开放式的架构使得用户选择性很强,同时社区开发与维护人数众多.其功能稳定,性能卓越,且 ...

  8. 71. Simplify Path (Stack)

    Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...

  9. WWW缓存方式

    缓存方式 使用WWW.LoadFromCacheOrDownload接口.AssetBundles将保存在本地设备的Unity的缓存文件夹中.WebPlayer 有50MB的缓存上限,PC/Mac/A ...

  10. chrome crx插件存档

    https://github.com/mdamien/chrome-extensions-archive